{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"soldOut","type":"bool"}],"name":"DrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"LateRandomnessIgnored","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentDeferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sponsor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFloor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"PrizeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"randomWord","type":"uint256"}],"name":"RandomnessReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"RefundsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pool","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyback","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"randomWord","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstTicket","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"bool","name":"gifted","type":"bool"}],"name":"TicketsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"ticket","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WinnerPaid","type":"event"},{"inputs":[],"name":"EMERGENCY_REFUND_AFTER","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VRF_RETRY_AFTER","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addToPrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"buyTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"buyTicketsFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"buyTicketsWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorTickets","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firstRequestedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"uint256","name":"floor","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint16","name":"growthBps","type":"uint16"},{"internalType":"uint256","name":"ticketPrice","type":"uint256"},{"internalType":"uint32","name":"maxTickets","type":"uint32"},{"internalType":"uint32","name":"minTickets","type":"uint32"},{"internalType":"uint64","name":"deadline","type":"uint64"},{"internalType":"uint16","name":"feeBps","type":"uint16"},{"internalType":"uint16","name":"buybackBps","type":"uint16"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"buybackRecipient","type":"address"},{"internalType":"bool","name":"giftsEnabled","type":"bool"},{"internalType":"uint16","name":"giftCap","type":"uint16"},{"internalType":"address","name":"discountToken","type":"address"},{"internalType":"uint256","name":"discountThreshold","type":"uint256"},{"internalType":"uint16","name":"discountBps","type":"uint16"},{"internalType":"string","name":"tag","type":"string"}],"internalType":"struct RaffleVaultV2.Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffle","outputs":[{"components":[{"internalType":"enum RaffleVaultV2.State","name":"state","type":"uint8"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"floor","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"currentPrize","type":"uint256"},{"internalType":"uint16","name":"growthBps","type":"uint16"},{"internalType":"uint256","name":"ticketPrice","type":"uint256"},{"internalType":"uint32","name":"maxTickets","type":"uint32"},{"internalType":"uint32","name":"minTickets","type":"uint32"},{"internalType":"uint32","name":"sold","type":"uint32"},{"internalType":"uint64","name":"deadline","type":"uint64"},{"internalType":"uint256","name":"revenue","type":"uint256"},{"internalType":"uint256","name":"sponsorAdded","type":"uint256"},{"internalType":"uint32","name":"creatorTickets","type":"uint32"},{"internalType":"uint32","name":"giftedTickets","type":"uint32"},{"internalType":"bool","name":"giftsEnabled","type":"bool"},{"internalType":"uint16","name":"feeBps","type":"uint16"},{"internalType":"uint16[]","name":"shares","type":"uint16[]"},{"internalType":"string","name":"tag","type":"string"}],"internalType":"struct RaffleVaultV2.RaffleView","name":"v","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getRanges","outputs":[{"internalType":"uint256[]","name":"starts","type":"uint256[]"},{"internalType":"uint256[]","name":"ends","type":"uint256[]"},{"internalType":"address[]","name":"owners","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWinners","outputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"tickets","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftedTickets","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"giftedTo","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasRandom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"uint256","name":"floor","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint16","name":"growthBps","type":"uint16"},{"internalType":"uint256","name":"ticketPrice","type":"uint256"},{"internalType":"uint32","name":"maxTickets","type":"uint32"},{"internalType":"uint32","name":"minTickets","type":"uint32"},{"internalType":"uint64","name":"deadline","type":"uint64"},{"internalType":"uint16","name":"feeBps","type":"uint16"},{"internalType":"uint16","name":"buybackBps","type":"uint16"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"buybackRecipient","type":"address"},{"internalType":"bool","name":"giftsEnabled","type":"bool"},{"internalType":"uint16","name":"giftCap","type":"uint16"},{"internalType":"address","name":"discountToken","type":"address"},{"internalType":"uint256","name":"discountThreshold","type":"uint256"},{"internalType":"uint16","name":"discountBps","type":"uint16"},{"internalType":"string","name":"tag","type":"string"}],"internalType":"struct RaffleVaultV2.Config","name":"c","type":"tuple"},{"internalType":"uint16[]","name":"tierShares","type":"uint16[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRequestedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"word","type":"uint256"}],"name":"onRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAction","outputs":[{"internalType":"enum RaffleVaultV2.Action","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"}],"name":"priceFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomWord","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rangesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retryRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"settle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sponsorAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sponsorContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum RaffleVaultV2.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ticket","type":"uint256"}],"name":"ticketOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ticketsOf","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{},"title":"RaffleVaultV2","version":1},"userdoc":{"kind":"user","methods":{"addToPrize(uint256)":{"notice":"Sponsors (or anyone) can add to the prize while sales are open; floor and cap both rise."},"buyTicketsFor(address,uint256)":{"notice":"Gift tickets: an allow-listed sponsor pays the base price and the tickets belong to `recipient`. Refunds for gifted tickets go back to the sponsor who paid."},"buyTicketsWithETH(uint256)":{"notice":"Pay in ETH when the raffle token is WETH; ETH is wrapped here and any excess is returned."},"claim()":{"notice":"Payouts that could not be pushed (e.g. a blocked recipient) are collected here."},"claimRefund()":{"notice":"Ticket payments and prize additions back to whoever paid them."},"constructor":{"notice":"The implementation itself can never be initialised or used"},"emergencyRefund()":{"notice":"Last resort if VRF never answers (e.g. subscription out of funds): refunds for everyone. Measured from the first request so retries cannot postpone it."},"finalize()":{"notice":"After the deadline anyone may finalize: draw if enough tickets were sold, otherwise refund everyone."},"getRanges(uint256,uint256)":{"notice":"Purchase ranges for verification pages: [start, end] 1-based inclusive with the owner"},"onRandomness(uint256,uint256)":{"notice":"Called by the factory's VRF callback. Never reverts on a stale or duplicate answer \u2014 it is ignored."},"pendingAction()":{"notice":"The next action anyone may perform now; NONE when the raffle needs nothing (or is closed)"},"retryRandomness()":{"notice":"If VRF has not answered for a while, anyone may request again. Answers to older requests are ignored."},"ticketOwner(uint256)":{"notice":"Owner of a 1-based ticket number"}},"notice":"One raffle. Deployed as an EIP-1167 clone by RaffleFactoryV2 and initialised once. Rules (all fixed at creation):  - Tickets are priced in the prize token. DUTY3 holders get a discount on tickets they buy themselves.  - Prize pool = min(cap, floor + growthBps \u00d7 ticket revenue). Sponsors may add to the prize, which raises    both floor and cap by the same amount.  - Sold out \u2192 draw immediately. After the deadline anyone may finalize: \u2265 minTickets sold \u2192 draw with the    current pool; otherwise everyone is refunded (no expiry) and the floor returns to the creator.  - Winners: one per tier, distinct tickets; a wallet may win several tiers in proportion to its tickets.  - The VRF callback only stores the random word; anyone then calls settle() to pay out.  - A failed transfer to one recipient never blocks the others: the amount becomes claimable.  - The factory pause stops new tickets and prize additions only \u2014 never draws, refunds or payouts.","version":1}},"settings":{"compilationTarget":{"contracts/v2/RaffleVaultV2.sol":"RaffleVaultV2"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"@openzeppelin/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"@openzeppelin/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"@openzeppelin/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098","license":"MIT","urls":["bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0","dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"contracts/v2/RaffleMathV2.sol":{"keccak256":"0x4bc9664cfb923bcede4ed5bbafa859ba347731edfe886600ddbd3a6d94a6d711","license":"MIT","urls":["bzz-raw://ae89c9b77bcf62ba6dc380888438d21818dca2e1e8a06d62496ff1e5aab917fc","dweb:/ipfs/QmZBhMy4jmcr9JEHNj4FCYanL8bED1Rkh7cBkE7q6JUSXW"]},"contracts/v2/RaffleVaultV2.sol":{"keccak256":"0x67452e9c4571690c1e60e2f1479db50c10ef7a49710b1442553f34efab354ae7","license":"MIT","urls":["bzz-raw://faf910a03c283d387ad2b07bd2ba76f91cdbf50e566823779d40d4ab397a9fa1","dweb:/ipfs/QmWbgrALSDup7hfFMZmpTtkQmfULbxrFjGrdR2Hg1bfxdu"]}},"version":1}