{"workflow":{"id":"b1df4c7c-4882-4f61-a69a-70ddecea3740","objective":"PAWN: the Pawn ($PAWN) token and five contracts on Ethereum mainnet. A pawn shop for identity.md seats: borrow ETH against a seat while it keeps working in the IMD swarm. Fixed-term loans, no liquidations: repay by the deadline or the seat is auctioned. Lenders earn loan fees behind a reserve. Locking PAWN lowers the fee. Name \"Pawn\", symbol \"PAWN\". Owner forwards claimed trading fees to LendingPool.donate(). X: @PawnIMD. No clarifying questions; sane defaults, documented. Percentages in bps.\n\nOWNER: 0x23e5d7a7b4ea19530ec39c67cd46aa8c10d15acf, Ownable2Step everywhere. Only the powers listed; lender-affecting changes wait 48h; no owner function moves pool ETH, NFTs, proceeds, reserves, locked PAWN or the burn vault.\n\nCONTRACTS (Solidity 0.8.26, Foundry, OpenZeppelin, no proxies, reentrancy guards, ETH owed is pulled via claim(), rounding favors the pool)\n\n1. CollateralVault (EIP-1167 clone per loan, initialized once by PawnShop, onERC721Received). Holds one NFT. ERC-1271 isValidSignature: only for isSeat collections, returns the magic value ONLY for an IMD WorkerAuthorization EIP-712 digest {deviceKey, wallet, tokenId, nonce, expiresAt, relayOrigin} the borrower registered via authorizeWorker(message); any other hash fails. callFor(target, data): borrower only, loan active, no value, for claiming rewards; reverts if target is the collection, PawnShop, LendingPool or the vault, or if the vault no longer owns the NFT after. Borrower can withdraw ETH/ERC-20 in the vault; the NFT leaves only via PawnShop.\n\n2. PawnShop. Terms: 0 = 30 days, 300 bps; 1 = 7 days, 100 bps; owner can queue terms (7-90 days, 50-1000 bps), live after 48h; open loans never change; min loan 0.01 ETH. Collections: per collection max loan per term (bps of floor, 0 disables), max share of pool totalAssets (bps), floor questionHash, isSeat; hard limits max loan 4000 bps, non-seat share 2500 bps; constructor registers identity.md 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D (isSeat, 4000 each term, share 10000); owner queues additions or changes (48h), can disable a collection's new loans at once; a zero questionHash is settable once. New loans start paused. pawn(collection, tokenId, termId): NFT into a new vault, lend up to the term's share of the floor in ETH; fee after discount deducted upfront; module records the PAWN committed; repay full principal; reverts if share exceeded or idle ETH short. repay/extend any time until an auction starts; extend pays the chosen term's fee after discount and pushes the due date out by the term; repay and auction settlement call release(loanId) on the module. Fees: 85% to LendingPool, 15% protocol, filling in order: bounty reserve to 0.2 ETH, pool shortfall reserve to 5% of totalAssets, then the fee recipient (owner at deploy, changeable after 48h). Discount module: LockDiscount at deploy, swappable after 48h; lower of module fee and term fee. Default: after due + 3-day grace, anyone calls startAuction for 0.002 ETH bounty; Dutch auction in ETH from the last stored floor (even stale) to 70% over 72h, then to 50% over 7 days, then holds; proceeds repay principal, surplus to borrower. Floor: anyone submits a signed IMD oracle attestation per collection (OracleAttestation v2, domain {\"IdentityMD Oracle\",\"2\",chainId 1,this contract}; pinned attester; collection questionHash; answerType uint256, wei; panelSize>=5; agreed>=4; not expired; issued within 26h; newer than stored); first valid per collection per 24h earns 0.001 ETH; no fresh floor = no new loans or extensions, repay and auctions always work. Attester: constructor arg per api.imd.fun; settable once if zero; changes 48h. Owner can only: pause/unpause new loans; queue terms, collections, parameters; set a zero questionHash or attester once; change attester, fee recipient or module after 48h; two-step transfer. Repay, withdraw, claim, unlock and auctions never pause.\n\n3. LendingPool. OpenZeppelin ERC-4626 over WETH 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, decimals offset, native ETH helpers; only PawnShop borrows and repays; withdrawals limited to idle assets. donate(): ETH from anyone, vested into the share price over 7 days. Shortfall reserve outside the share price absorbs auction gaps first. Deposit cap 10 ETH; owner can only raise it.\n\n4. LockDiscount (no owner). lock/unlock any time except PAWN committed to an open loan. Tiers by locked balance at pawn or extend: 2000 bps off at 1,000,000 PAWN, 3333 at 5,000,000, 5000 at 20,000,000. A discounted loan commits the tier amount; unlockable = locked minus the largest open commitment; release(loanId) from PawnShop drops it.\n\n5. MilestoneBurn (no owner, no withdrawal). Anyone sends PAWN in; burn(): anyone, on a signed IMD oracle attestation (same rules, own questionHash settable once) stating PAWN fully diluted market cap in USD 18 decimals >= 1,000,000e18, burns all to dEaD once.\n\nTESTS: Foundry unit, fuzz, invariant (mock ERC-721 in test/ only). DOCS: README with how it works, owner powers, risks, bounties, tiers, burn, oracle top-ups, addresses.\n\nWEBSITE (static, IPFS-ready, public RPC, Etherscan links, mobile-first, links x.com/PawnIMD). Shows: pitch, floor and age, pool vs cap, utilization, lender income, reserve, loans and auctions, terms and tiers, burn vault vs $1M, health, stats, risks, trade panel. Wallet can: buy/sell PAWN; pawn a seat (term, max, fee, due date, lock PAWN for a tier until the loan closes); repay; extend; lock/unlock; authorize a worker device (paste IMD pairing message); claim rewards, vault tokens, ETH; deposit/withdraw; buy or start auctions; post floor; trigger burn; owner: unpause, raise cap, queue changes, set hash/attester once, claim fees.","status":"completed","brief":"# Approved workflow\n\nPAWN: the Pawn ($PAWN) token and five contracts on Ethereum mainnet. A pawn shop for identity.md seats: borrow ETH against a seat while it keeps working in the IMD swarm. Fixed-term loans, no liquidations: repay by the deadline or the seat is auctioned. Lenders earn loan fees behind a reserve. Locking PAWN lowers the fee. Name \"Pawn\", symbol \"PAWN\". Owner forwards claimed trading fees to LendingPool.donate(). X: @PawnIMD. No clarifying questions; sane defaults, documented. Percentages in bps.\n\nOWNER: 0x23e5d7a7b4ea19530ec39c67cd46aa8c10d15acf, Ownable2Step everywhere. Only the powers listed; lender-affecting changes wait 48h; no owner function moves pool ETH, NFTs, proceeds, reserves, locked PAWN or the burn vault.\n\nCONTRACTS (Solidity 0.8.26, Foundry, OpenZeppelin, no proxies, reentrancy guards, ETH owed is pulled via claim(), rounding favors the pool)\n\n1. CollateralVault (EIP-1167 clone per loan, initialized once by PawnShop, onERC721Received). Holds one NFT. ERC-1271 isValidSignature: only for isSeat collections, returns the magic value ONLY for an IMD WorkerAuthorization EIP-712 digest {deviceKey, wallet, tokenId, nonce, expiresAt, relayOrigin} the borrower registered via authorizeWorker(message); any other hash fails. callFor(target, data): borrower only, loan active, no value, for claiming rewards; reverts if target is the collection, PawnShop, LendingPool or the vault, or if the vault no longer owns the NFT after. Borrower can withdraw ETH/ERC-20 in the vault; the NFT leaves only via PawnShop.\n\n2. PawnShop. Terms: 0 = 30 days, 300 bps; 1 = 7 days, 100 bps; owner can queue terms (7-90 days, 50-1000 bps), live after 48h; open loans never change; min loan 0.01 ETH. Collections: per collection max loan per term (bps of floor, 0 disables), max share of pool totalAssets (bps), floor questionHash, isSeat; hard limits max loan 4000 bps, non-seat share 2500 bps; constructor registers identity.md 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D (isSeat, 4000 each term, share 10000); owner queues additions or changes (48h), can disable a collection's new loans at once; a zero questionHash is settable once. New loans start paused. pawn(collection, tokenId, termId): NFT into a new vault, lend up to the term's share of the floor in ETH; fee after discount deducted upfront; module records the PAWN committed; repay full principal; reverts if share exceeded or idle ETH short. repay/extend any time until an auction starts; extend pays the chosen term's fee after discount and pushes the due date out by the term; repay and auction settlement call release(loanId) on the module. Fees: 85% to LendingPool, 15% protocol, filling in order: bounty reserve to 0.2 ETH, pool shortfall reserve to 5% of totalAssets, then the fee recipient (owner at deploy, changeable after 48h). Discount module: LockDiscount at deploy, swappable after 48h; lower of module fee and term fee. Default: after due + 3-day grace, anyone calls startAuction for 0.002 ETH bounty; Dutch auction in ETH from the last stored floor (even stale) to 70% over 72h, then to 50% over 7 days, then holds; proceeds repay principal, surplus to borrower. Floor: anyone submits a signed IMD oracle attestation per collection (OracleAttestation v2, domain {\"IdentityMD Oracle\",\"2\",chainId 1,this contract}; pinned attester; collection questionHash; answerType uint256, wei; panelSize>=5; agreed>=4; not expired; issued within 26h; newer than stored); first valid per collection per 24h earns 0.001 ETH; no fresh floor = no new loans or extensions, repay and auctions always work. Attester: constructor arg per api.imd.fun; settable once if zero; changes 48h. Owner can only: pause/unpause new loans; queue terms, collections, parameters; set a zero questionHash or attester once; change attester, fee recipient or module after 48h; two-step transfer. Repay, withdraw, claim, unlock and auctions never pause.\n\n3. LendingPool. OpenZeppelin ERC-4626 over WETH 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, decimals offset, native ETH helpers; only PawnShop borrows and repays; withdrawals limited to idle assets. donate(): ETH from anyone, vested into the share price over 7 days. Shortfall reserve outside the share price absorbs auction gaps first. Deposit cap 10 ETH; owner can only raise it.\n\n4. LockDiscount (no owner). lock/unlock any time except PAWN committed to an open loan. Tiers by locked balance at pawn or extend: 2000 bps off at 1,000,000 PAWN, 3333 at 5,000,000, 5000 at 20,000,000. A discounted loan commits the tier amount; unlockable = locked minus the largest open commitment; release(loanId) from PawnShop drops it.\n\n5. MilestoneBurn (no owner, no withdrawal). Anyone sends PAWN in; burn(): anyone, on a signed IMD oracle attestation (same rules, own questionHash settable once) stating PAWN fully diluted market cap in USD 18 decimals >= 1,000,000e18, burns all to dEaD once.\n\nTESTS: Foundry unit, fuzz, invariant (mock ERC-721 in test/ only). DOCS: README with how it works, owner powers, risks, bounties, tiers, burn, oracle top-ups, addresses.\n\nWEBSITE (static, IPFS-ready, public RPC, Etherscan links, mobile-first, links x.com/PawnIMD). Shows: pitch, floor and age, pool vs cap, utilization, lender income, reserve, loans and auctions, terms and tiers, burn vault vs $1M, health, stats, risks, trade panel. Wallet can: buy/sell PAWN; pawn a seat (term, max, fee, due date, lock PAWN for a tier until the loan closes); repay; extend; lock/unlock; authorize a worker device (paste IMD pairing message); claim rewards, vault tokens, ETH; deposit/withdraw; buy or start auctions; post floor; trigger burn; owner: unpause, raise cap, queue changes, set hash/attester once, claim fees.\n\nThe requester chose this release: source code published to GitHub, website hosted on IPFS, contracts deployed on chain.\n\nPAWN: the Pawn ($PAWN) token and five contracts on Ethereum mainnet. A pawn shop for identity.md seats: borrow ETH against a seat while it keeps working in the IMD swarm. Fixed-term loans, no liquidations: repay by the deadline or the seat is auctioned. Lenders earn loan fees behind a reserve. Locking PAWN lowers the fee. Name \"Pawn\", symbol \"PAWN\". Owner forwards claimed trading fees to LendingPool.donate(). X: @PawnIMD. No clarifying questions; sane defaults, documented. Percentages in bps.\n\nOWNER: 0x23e5d7a7b4ea19530ec39c67cd46aa8c10d15acf, Ownable2Step everywhere. Only the powers listed; lender-affecting changes wait 48h; no owner function moves pool ETH, NFTs, proceeds, reserves, locked PAWN or the burn vault.\n\nCONTRACTS (Solidity 0.8.26, Foundry, OpenZeppelin, no proxies, reentrancy guards, ETH owed is pulled via claim(), rounding favors the pool)\n\n1. CollateralVault (EIP-1167 clone per loan, initialized once by PawnShop, onERC721Received). Holds one NFT. ERC-1271 isValidSignature: only for isSeat collections, returns the magic value ONLY for an IMD WorkerAuthorization EIP-712 digest {deviceKey, wallet, tokenId, nonce, expiresAt, relayOrigin} the borrower registered via authorizeWorker(message); any other hash fails. callFor(target, data): borrower only, loan active, no value, for claiming rewards; reverts if target is the collection, PawnShop, LendingPool or the vault, or if the vault no longer owns the NFT after. Borrower can withdraw ETH/ERC-20 in the vault; the NFT leaves only via PawnShop.\n\n2. PawnShop. Terms: 0 = 30 days, 300 bps; 1 = 7 days, 100 bps; owner can queue terms (7-90 days, 50-1000 bps), live after 48h; open loans never change; min loan 0.01 ETH. Collections: per collection max loan per term (bps of floor, 0 disables), max share of pool totalAssets (bps), floor questionHash, isSeat; hard limits max loan 4000 bps, non-seat share 2500 bps; constructor registers identity.md 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D (isSeat, 4000 each term, share 10000); owner queues additions or changes (48h), can disable a collection's new loans at once; a zero questionHash is settable once. New loans start paused. pawn(collection, tokenId, termId): NFT into a new vault, lend up to the term's share of the floor in ETH; fee after discount deducted upfront; module records the PAWN committed; repay full principal; reverts if share exceeded or idle ETH short. repay/extend any time until an auction starts; extend pays the chosen term's fee after discount and pushes the due date out by the term; repay and auction settlement call release(loanId) on the module. Fees: 85% to LendingPool, 15% protocol, filling in order: bounty reserve to 0.2 ETH, pool shortfall reserve to 5% of totalAssets, then the fee recipient (owner at deploy, changeable after 48h). Discount module: LockDiscount at deploy, swappable after 48h; lower of module fee and term fee. Default: after due + 3-day grace, anyone calls startAuction for 0.002 ETH bounty; Dutch auction in ETH from the last stored floor (even stale) to 70% over 72h, then to 50% over 7 days, then holds; proceeds repay principal, surplus to borrower. Floor: anyone submits a signed IMD oracle attestation per collection (OracleAttestation v2, domain {\"IdentityMD Oracle\",\"2\",chainId 1,this contract}; pinned attester; collection questionHash; answerType uint256, wei; panelSize>=5; agreed>=4; not expired; issued within 26h; newer than stored); first valid per collection per 24h earns 0.001 ETH; no fresh floor = no new loans or extensions, repay and auctions always work. Attester: constructor arg per api.imd.fun; settable once if zero; changes 48h. Owner can only: pause/unpause new loans; queue terms, collections, parameters; set a zero questionHash or attester once; change attester, fee recipient or module after 48h; two-step transfer. Repay, withdraw, claim, unlock and auctions never pause.\n\n3. LendingPool. OpenZeppelin ERC-4626 over WETH 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, decimals offset, native ETH helpers; only PawnShop borrows and repays; withdrawals limited to idle assets. donate(): ETH from anyone, vested into the share price over 7 days. Shortfall reserve outside the share price absorbs auction gaps first. Deposit cap 10 ETH; owner can only raise it.\n\n4. LockDiscount (no owner). lock/unlock any time except PAWN committed to an open loan. Tiers by locked balance at pawn or extend: 2000 bps off at 1,000,000 PAWN, 3333 at 5,000,000, 5000 at 20,000,000. A discounted loan commits the tier amount; unlockable = locked minus the largest open commitment; release(loanId) from PawnShop drops it.\n\n5. MilestoneBurn (no owner, no withdrawal). Anyone sends PAWN in; burn(): anyone, on a signed IMD oracle attestation (same rules, own questionHash settable once) stating PAWN fully diluted market cap in USD 18 decimals >= 1,000,000e18, burns all to dEaD once.\n\nTESTS: Foundry unit, fuzz, invariant (mock ERC-721 in test/ only). DOCS: README with how it works, owner powers, risks, bounties, tiers, burn, oracle top-ups, addresses.\n\nWEBSITE (static, IPFS-ready, public RPC, Etherscan links, mobile-first, links x.com/PawnIMD). Shows: pitch, floor and age, pool vs cap, utilization, lender income, reserve, loans and auctions, terms and tiers, burn vault vs $1M, health, stats, risks, trade panel. Wallet can: buy/sell PAWN; pawn a seat (term, max, fee, due date, lock PAWN for a tier until the loan closes); repay; extend; lock/unlock; authorize a worker device (paste IMD pairing message); claim rewards, vault tokens, ETH; deposit/withdraw; buy or start auctions; post floor; trigger burn; owner: unpause, raise cap, queue changes, set hash/attester once, claim fees.\n","briefDigest":"6276f1b94a64bdf13c4782796a61b787f749984297ebcc6df0fb080c018b4f9a"},"planning":null,"id":"8267708e-cdea-4a6b-9767-c37a4e87fbf6","state":"completed","template":"shape:chain","objective":"WORKFLOW FRONTEND STAGE CONTEXT: contracts are already deployed. This assignment produces the frontend source, committed static export and validation evidence within its write scope. Put frontend source, package.json, lockfiles and build configuration under web/, the static export at repository-root dist/, and documentation under docs/ or web/. A web/** scope also receives an explicit web/.gitignore allowance; directory globs exclude other dotfiles. Follow narrower assigned paths when supplied. Root configuration and lockfiles stay protected. Read .imd/reads/deployment.json, preserve deployed source, and obtain implementation-derived ABIs from docs/abi/<Contract>.json at the pinned source commit; verify their hashes against the handoff. Read .imd/reads/workflow.md for the complete approved requirements, including wallet connection, swap controls, observability and tests. Submit the source/export/evidence to complete this worker assignment. The publisher subsequently publishes source and hosts the export; published URLs and CIDs are not worker-completion prerequisites. This assignment does not publish the site or redeploy contracts.\n\nMANDATORY FRONTEND ACCEPTANCE: Emit dist/imd-deployment.json after the final static export. Its schema is {version:1,launchId,chainId,sourceCommit,attestationHash,contracts:[{name,address,abiHash,abiPath}],assets:[{path,sha256}]}, plus poolKey copied exactly from the deployment handoff when the handoff has one (currency0, currency1, fee, tickSpacing and hooks unchanged; validation refuses a site that leaves it out), plus network and optionally walletAddChain copied unchanged from .imd/reads/network.json when it exists; add no other top-level key. Copy launchId, chainId, deployed sourceCommit, attestationHash and the exact contract set/name/address/abiHash from the validated deployment handoff. Export each implementation-derived ABI as JSON; abiPath and asset paths are relative to dist/, never URLs or parent traversal. The frontend must load this same imd-deployment.json as its runtime deployment configuration and load the referenced ABI JSON; do not maintain a separate address/chain/ABI map that can disagree. After building, enumerate every exported file except imd-deployment.json, including index.html and all ABI JSON, and record each file's SHA-256 as lowercase hex. At most 128 assets and 8 MiB per file. The checker has a 64 MiB total HTTP response-body budget across immutable and named copies of assets/configuration plus RPC responses, so keep the export below half that budget with room for overhead. The manifest excludes itself to avoid a recursive hash. Rebuild the manifest after any export change and commit it with the export. Worker build/typecheck/browser/interaction validation remains required. After source delivery, IPFS pinning and site naming, the control plane checks the fixed CID and named entrypoint, all declared asset hashes, deployment configuration/ABI hashes against the attested handoff, and configured-RPC chain ID and nonempty contract code. It does not execute browser JavaScript or wallet swaps. Submit before these publication checks run; their success gates overall workflow completion.","blockedReason":null,"createdAt":"2026-10-08T08:35:45.324Z","updatedAt":"2026-10-08T09:27:38.693Z","paidBy":"0x23e5d7a7b4ea19530ec39c67cd46aa8c10d15acf","parentJobId":"699b8539-76a2-4c37-b11e-ba4d269487ad","project":{"id":"699b8539-76a2-4c37-b11e-ba4d269487ad","head":"8267708e-cdea-4a6b-9767-c37a4e87fbf6","running":null,"versions":[{"jobId":"699b8539-76a2-4c37-b11e-ba4d269487ad","workflowId":"b1df4c7c-4882-4f61-a69a-70ddecea3740","objective":"PAWN: the Pawn ($PAWN) token and five contracts on Ethereum mainnet. A pawn shop for identity.md seats: borrow ETH against a seat while it keeps working in the IMD swarm. Fixed-term loans, no liquidations: repay by the deadline or the seat is auctioned. Lenders earn loan fees behind a reserve. Locking PAWN lowers the fee. Name \"Pawn\", symbol \"PAWN\". Owner forwards claimed trading fees to LendingPool.donate(). X: @PawnIMD. No clarifying questions; sane defaults, documented. Percentages in bps.\n\nOWNER: 0x23e5d7a7b4ea19530ec39c67cd46aa8c10d15acf, Ownable2Step everywhere. Only the powers listed; lender-affecting changes wait 48h; no owner function moves pool ETH, NFTs, proceeds, reserves, locked PAWN or the burn vault.\n\nCONTRACTS (Solidity 0.8.26, Foundry, OpenZeppelin, no proxies, reentrancy guards, ETH owed is pulled via claim(), rounding favors the pool)\n\n1. CollateralVault (EIP-1167 clone per loan, initialized once by PawnShop, onERC721Received). Holds one NFT. ERC-1271 isValidSignature: only for isSeat collections, returns the magic value ONLY for an IMD WorkerAuthorization EIP-712 digest {deviceKey, wallet, tokenId, nonce, expiresAt, relayOrigin} the borrower registered via authorizeWorker(message); any other hash fails. callFor(target, data): borrower only, loan active, no value, for claiming rewards; reverts if target is the collection, PawnShop, LendingPool or the vault, or if the vault no longer owns the NFT after. Borrower can withdraw ETH/ERC-20 in the vault; the NFT leaves only via PawnShop.\n\n2. PawnShop. Terms: 0 = 30 days, 300 bps; 1 = 7 days, 100 bps; owner can queue terms (7-90 days, 50-1000 bps), live after 48h; open loans never change; min loan 0.01 ETH. Collections: per collection max loan per term (bps of floor, 0 disables), max share of pool totalAssets (bps), floor questionHash, isSeat; hard limits max loan 4000 bps, non-seat share 2500 bps; constructor registers identity.md 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D (isSeat, 4000 each term, share 10000); owner queues additions or changes (48h), can disable a collection's new loans at once; a zero questionHash is settable once. New loans start paused. pawn(collection, tokenId, termId): NFT into a new vault, lend up to the term's share of the floor in ETH; fee after discount deducted upfront; module records the PAWN committed; repay full principal; reverts if share exceeded or idle ETH short. repay/extend any time until an auction starts; extend pays the chosen term's fee after discount and pushes the due date out by the term; repay and auction settlement call release(loanId) on the module. Fees: 85% to LendingPool, 15% protocol, filling in order: bounty reserve to 0.2 ETH, pool shortfall reserve to 5% of totalAssets, then the fee recipient (owner at deploy, changeable after 48h). Discount module: LockDiscount at deploy, swappable after 48h; lower of module fee and term fee. Default: after due + 3-day grace, anyone calls startAuction for 0.002 ETH bounty; Dutch auction in ETH from the last stored floor (even stale) to 70% over 72h, then to 50% over 7 days, then holds; proceeds repay principal, surplus to borrower. Floor: anyone submits a signed IMD oracle attestation per collection (OracleAttestation v2, domain {\"IdentityMD Oracle\",\"2\",chainId 1,this contract}; pinned attester; collection questionHash; answerType uint256, wei; panelSize>=5; agreed>=4; not expired; issued within 26h; newer than stored); first valid per collection per 24h earns 0.001 ETH; no fresh floor = no new loans or extensions, repay and auctions always work. Attester: constructor arg per api.imd.fun; settable once if zero; changes 48h. Owner can only: pause/unpause new loans; queue terms, collections, parameters; set a zero questionHash or attester once; change attester, fee recipient or module after 48h; two-step transfer. Repay, withdraw, claim, unlock and auctions never pause.\n\n3. LendingPool. OpenZeppelin ERC-4626 over WETH 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, decimals offset, native ETH helpers; only PawnShop borrows and repays; withdrawals limited to idle assets. donate(): ETH from anyone, vested into the share price over 7 days. Shortfall reserve outside the share price absorbs auction gaps first. Deposit cap 10 ETH; owner can only raise it.\n\n4. LockDiscount (no owner). lock/unlock any time except PAWN committed to an open loan. Tiers by locked balance at pawn or extend: 2000 bps off at 1,000,000 PAWN, 3333 at 5,000,000, 5000 at 20,000,000. A discounted loan commits the tier amount; unlockable = locked minus the largest open commitment; release(loanId) from PawnShop drops it.\n\n5. MilestoneBurn (no owner, no withdrawal). Anyone sends PAWN in; burn(): anyone, on a signed IMD oracle attestation (same rules, own questionHash settable once) stating PAWN fully diluted market cap in USD 18 decimals >= 1,000,000e18, burns all to dEaD once.\n\nTESTS: Foundry unit, fuzz, invariant (mock ERC-721 in test/ only). DOCS: README with how it works, owner powers, risks, bounties, tiers, burn, oracle top-ups, addresses.\n\nWEBSITE (static, IPFS-ready, public RPC, Etherscan links, mobile-first, links x.com/PawnIMD). Shows: pitch, floor and age, pool vs cap, utilization, lender income, reserve, loans and auctions, terms and tiers, burn vault vs $1M, health, stats, risks, trade panel. Wallet can: buy/sell PAWN; pawn a seat (term, max, fee, due date, lock PAWN for a tier until the loan closes); repay; extend; lock/unlock; authorize a worker device (paste IMD pairing message); claim rewards, vault tokens, ETH; deposit/withdraw; buy or start auctions; post floor; trigger burn; owner: unpause, raise cap, queue changes, set hash/attester once, claim fees.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-08T03:56:30.027Z"}]},"deliver":true,"host":true,"site":{"id":"a2ec0953-d48c-45a7-bf6a-4599c0bd79fb","jobId":"8267708e-cdea-4a6b-9767-c37a4e87fbf6","kind":"launch","tokenId":null,"agentId":null,"url":"https://pawn.site.identitymd.eth.limo","status":"named","holdReason":null,"takenDownAt":null,"takenDownReason":null,"label":"pawn","cid":"bafybeig73v6wyd2mjhvs5s7nqvt5vvtsblryucs7dzxhts4g6lefzcwama","bytes":656360,"ensName":"pawn.site.identitymd.eth","txHash":"0xf79c1f766e7f0170fe9a63e6cbe3f617eb8aa3c94ce82e2c8b0d8c08f8e78095","blockNumber":26146786,"attempts":0,"failure":null,"pinnedAt":"2026-10-08T09:27:47.703Z","namedAt":"2026-10-08T09:28:49.536Z","supersededBy":null,"supersededAt":null,"createdAt":"2026-10-08T09:27:38.693Z","updatedAt":"2026-10-08T09:28:49.536Z"},"launch":{"requested":false,"kind":null,"id":null,"status":null,"chainId":null},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-1031-workflow-frontend-stage-context","pullRequestUrl":"https://github.com/identity-md-launches/launch-1031-workflow-frontend-stage-context/pull/1","commit":"220319fe418655d9b37571024a45dd6a7f4e96c3","deliveredAt":"2026-10-08T09:27:53.008Z","media":null},"media":null,"nodes":[{"key":"frontend_for_contract","role":"implement","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":["web/**","dist/**","docs/**","web/.gitignore"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T09:27:38.693Z","verdict":{"status":"accepted","profile":"none","evaluation":"structural","rejectionCode":null,"detail":"paths and tree verified; no suite was run for this kind of work","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"24f609f274ddc2508d62794dec40affd9fcd13a0","at":"2026-10-08T09:27:38.694Z","failedChecks":[]},"seat":{"tokenId":"1435","agentId":"51439"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"frontend_for_contract","agentId":"51439","value":1,"role":"verification:structural"}]}]}