## 1. What is the NFT Claim Hub? The NFT Claim Hub is a **platform for automated distribution of token rewards to NFT holders**. As an NFT project you can: - Offer rewards for holders of specific collections or with specific NFT attributes - Set time-based windows (start/end), cooldowns and caps - Run surveys and reward participants or drawn winners - Run promotions with a limited number of claims - Configure streak rewards (e.g. "7 days in a row active") - Manage everything via an admin dashboard without writing smart contract code Payouts are **on-chain**: users sign a transaction and receive tokens directly to their wallet. The contract enforces eligibility, cooldown and limits. **Operator.** The NFT Claim Hub is operated by **Bloxprod**. For more information and contact, see: https://bloxprod.io --- ## 2. Onboarding: From project creation to self-service configuration **Step 1 - Create project (onboarding)** A new project is created by the **platform operator** (contract owner). This sets: - Project ID, name, description, homepage, image - **Vault account** for the project (rewards are paid out from this account on claim) - Optionally which accounts may manage the project as **project owners** (allowedAccounts) **Step 2 - Project owner can configure everything** Once your account is in the project's **allowedAccounts**, you can do the following in the admin dashboard **without further technical steps**: - Edit project metadata (name, description, homepage, image) - Adjust allowed accounts for project management (allowedAccounts) - Create and edit pools (reward, promotion, survey, streak pools) - Define **dependent NFT rules** per pool (see section 3.5) so rewards require a specific combination of NFTs - Create, edit, close surveys and draw winners - Create promotions, create pools from them and manage limits - Define streaks (days, "in a row", collection, reward) - Set RAM budget and manage deposits (rewards, RAMFee, manual) - Maintain an exclusion list for specific NFTs (excluded assets) - Optionally configure creator fee per pool - View claims and wallets per pool and use the claim calculator You work only through the admin UI; the smart contract executes the logic on-chain. --- ## 3. Pool types and their capabilities Each pool belongs to a project and has a **pool type**. The type determines **who** can claim and **how** counting works (per NFT vs per wallet). ### 3.1 Reward pool (type 1) - **Purpose**: Classic reward for NFT holders of a given collection. - **Eligibility**: Anyone holding at least one NFT of the configured collection (optionally with extra attributes or **dependent NFT rules**) can claim the pool. - **Payout**: Per eligible NFT or per wallet depending on **cooldown**: - **Cooldown = 0**: Can claim repeatedly (typically per NFT). - **Cooldown > 0**: Minimum time between two claims from the same wallet (in seconds). - **Cooldown = maximum ("forever")**: Once per wallet per pool - ideal for "one claim per holder". **Configuration (for project owner):** - **Pool key**: Unique key within the project (e.g. `daily_rewards`, `vip_bonus`). - **Collection name**: AtomicAssets collection (e.g. your NFT collection). - **Reward**: Amount and token (e.g. 1000 CYPHR, or other allowed tokens) - only contract-allowed tokens are selectable. - **Active**, **start/end time** (optional): Time window when claiming is allowed. - **Cooldown**: Seconds between two claims from the same wallet (or maximum for once per wallet). - **Required immutable**: Optional NFT attributes (e.g. `rarity=legendary`) that must be satisfied. - **Pool description and image**: For display in the claim app. - **Dependent NFT rules** (optional): Extra requirements so that the reward is only possible with a **specific combination of NFTs** (see section 3.5). **Guidance:** - Daily rewards: set cooldown e.g. 86400 (24 h). - One-time action per holder: set cooldown to maximum. - Higher reward for "VIPs": use a separate pool with a dependent rule (e.g. at least 2 NFTs from the same collection). --- ### 3.2 Promotion pool (type 2) - **Purpose**: Limited campaign - only a fixed number of claims (e.g. "first 500 get X"). - **Eligibility**: Depends on promotion config: either everyone holding an NFT of the linked collection, or (with collectionName = `account`) any wallet - no NFT check. - **Payout**: One claim per eligible wallet until **maxClaimCount** is reached. Then the promotion ends. **Configuration (for project owner):** - **Create promotion**: Name, project, collection (or `account`), reward (amount + token), start/end time, **max claim count** (e.g. 500). - **Create pool from promotion**: When the promotion is active and no pool exists yet, you can choose "Create pool". The contract creates a pool of type "Promotion" and links it to the promotion. - **Status**: "Active", "Finished" (when actualClaimCount >= maxClaimCount), or "Inactive". **Guidance:** - For "first 500": set maxClaimCount = 500; use your collection or `account` if anyone can participate. - Time-limited campaign: set start/end; no new claims after end. --- ### 3.3 Survey pool (type 3) - **Purpose**: Reward for survey participation or for drawn winners (raffle). - **Eligibility**: Only users who participated in the linked survey - and depending on survey type: - **Normal (type 1)**: All participants can claim. - **Answer-based (type 2)**: Only participants who chose one of the configured options (requiredAnswers). - **Raffle (type 3)**: Only drawn winners can claim ("Draw winners" in admin). - **Payout**: Once per wallet (survey pools always use "max cooldown" internally). **Survey configuration:** - **Survey key**: Unique key within the project. - **Question (survey text)** and **2-6 options**. - **Survey type**: - **Normal (1)**: Every participant is eligible to claim. - **Answer-based (2)**: Only those who selected certain options (e.g. 1, 3, 5) - "Required answers" field with comma-separated option numbers. - **Raffle (3)**: Participating does not yet allow claim; you later draw a number of winners ("Draw winners") - only they can claim. - **Allow multiple**: Whether multiple options can be selected (multiple choice). - **Active**, **Closed**: Open/close the survey. - **Start/End**: Time window for participation. - **Create pool from survey**: After creating the survey you can create a "Survey pool" (reward, token, description, image). The pool is of type Survey and tied to this survey. **Guidance:** - Reward community feedback: type Normal, all participants can claim. - Reward only certain answers: type Answer-based, set requiredAnswers. - Giveaway: type Raffle, after end run "Draw winners" with desired number; only those can claim the pool. --- ### 3.4 Streak pool (type 4) - **Purpose**: Reward for completing a "streak" (e.g. 7 days in a row active). - **Eligibility**: Only wallets that have completed the streak (marked by the system/contract). - **Payout**: Once per wallet per completed streak (with optional cooldown for repeatable streaks). **Configuration (for project owner):** - **Streak ID**: Unique ID in the project (e.g. `weekly_streak`). - **Streak name**: Display name. - **Target streak days**: Number of days required for the streak (e.g. 7). - **Target in-a-row**: Number of consecutive days required (0 = not required). - **Collection name**: AtomicAssets collection or `account` (no NFT check). - **Reward**: Amount and token. - **Cooldown** (optional): e.g. 86400 if the same user can start another streak after one day. - **Active**, pool description, image, **required immutable** (optional). **Guidance:** - "7-day streak": set target streak days = 7, target in-a-row as needed (0 or 7). - One-time streak reward: set cooldown high or max. - Repeatable weekly streak: cooldown e.g. 604800 (7 days). --- ### 3.5 NFT dependencies: rewarding only a specific combination of NFTs You can **equip any reward pool (type 1) with dependent NFT rules** so that the reward is **only claimable when the user holds a specific combination of NFTs**, not just the pool's main collection. **How it works:** - The pool has a **main collection** (collectionName). The user must hold at least one eligible NFT from this collection (subject to required immutable attributes). - **In addition**, you add one or more **Dependent NFT rules** to the pool. Each rule states: "The wallet must also hold at least **N** NFTs from **collection X**" (optionally with **required immutable** attributes for that collection). - The user can claim **only if** they satisfy the main pool requirement **and** every dependent rule. So the reward is gated by a **combination** of holdings across collections. **Examples:** - "Claim 1000 CYPHR if you hold at least one NFT from collection `owlnoctun` **and** at least 2 NFTs from collection `owlnoctun`" (same collection, higher bar). - "Claim 500 CYPHR if you hold at least one NFT from `main_collection` **and** at least 1 NFT from `badge_collection` with attribute `badge=gold`." - "VIP pool: main collection `mygame`, plus dependent rule: at least 3 NFTs from `mygame`" - only multi-holders qualify. - Cross-collection: main collection A, dependent rule "at least 1 NFT from collection B" - reward only for holders of both A and B. **Configuration in the admin:** - Create or edit a **reward pool** (type 1) with the main collection and reward. - In **Dependent NFT Rules** add one or more rules. For each rule you set: - **reqKey**: Unique key for the rule (e.g. `must_hold_badges`). - **Collection name**: The other collection the user must hold NFTs from. - **nftcount**: Minimum number of NFTs from that collection (e.g. 2). - **Required immutable** (optional): Attributes that those NFTs must have (e.g. `rarity=legendary`). - **Active**: Rule on/off. - Save the rule(s). The contract then enforces: claim allowed only if the wallet meets the pool collection **and** every active dependent rule. So yes: **the possibility of equipping pools with NFT dependencies is fully supported** - you create a pool so that the reward is only possible with a specific combination of NFTs (main collection + one or more "must also hold N from collection X" rules). --- ## 4. Fees and how claiming is calculated ### 4.1 RAM fee (per-claim fee) - Each claim consumes on-chain **RAM** (storage for claims/wallets). The contract charges a **RAM fee per claim**. - Per project, a **RAM fee** (token + amount) and a **RAM budget** (how many claims are "allowed") are configured. - **Deposit**: You transfer the RAMFee token to the contract with memo **"RAMFee"** (type 1 deposit). The per-claim fee is deducted from this deposit. - **Set RAM budget**: In the admin you select a RAMFee deposit and set the budget (number of allowed claims). "Use max" computes the maximum from remaining deposit and feePerClaim. - Without sufficient RAM budget and RAMFee deposit, new claims for the project cannot be recorded. **For the project owner:** Check regularly: Is the RAMFee deposit and budget enough for expected claims? If not, add more RAMFee (memo "RAMFee") and increase the budget. ### 4.2 Creator fee (optional per pool) - You can enable a **creator fee** per pool: a percentage (in basis points, e.g. 500 = 5%) of the reward goes to a **receiver** account you specify. - Configure in the pool form: "Creator fee enabled", then fee % and receiver. Saving the pool may also execute the **setcrefee** action. - The contract pays the receiver when a claim is made. ### 4.3 How is the claim calculated? - **Reward pool (type 1):** - With cooldown = 0: One claim per eligible NFT (reward x number of NFTs). - With cooldown > 0 or max: Limited per wallet by cooldown or once per wallet; **reward amount** is the one configured for the pool (e.g. once X tokens per wallet). - **Promotion pool (type 2):** One claim per eligible wallet until maxClaimCount; reward = amount defined for the pool. - **Survey pool (type 3):** One claim per eligible wallet (all participants, only certain answers, or only drawn winners); reward = amount defined for the pool. - **Streak pool (type 4):** One claim per wallet per completed streak; reward = amount defined for the streak. **Actual available amount** is limited by **reward deposits** and any **manual deposits (type 2)**: claims are paid from the project vault; if the vault and internal accounting (deposits) are insufficient, the claim fails. The **claim calculator** in the admin shows an estimate (eligible NFTs/wallets, already claimed, remaining) - the contract does the final check at claim time. --- ## 5. Vault and permissions - Each project has a **vault account** (and optionally a **vault permission**). This is set at onboarding by the platform operator (**setpvault**). - **From the project owner's perspective:** - Rewards are paid from this vault to users. - The vault account must have a **permission** that allows the **nftrewards contract** to transfer tokens from this account to claimers (typically the token contract's `transfer` action with the vault's permission). - Without correct vault configuration, claims fail with permission errors. **What you need to do:** Ensure the vault account configured for your project holds enough tokens and that the contract has the required permission to send tokens from that account. The actual setup (setpvault) is usually done by the platform operator; you manage pools and deposits in the admin. --- ## 6. Other admin capabilities (project owner) - **Dependent NFT rules:** Per pool you can add multiple rules "at least N NFTs from collection X (optionally with attributes)" - only users who satisfy the pool collection **and** all these rules can claim. This is how you make a reward **only possible with a specific combination of NFTs** (see section 3.5). - **Excluded assets:** Exclude specific NFT asset IDs from claiming per project (e.g. banned or locked NFTs). - **Allowed tokens:** Which tokens are allowed for rewards and RAMFee is set by the contract owner; you only choose from these when creating pools/deposits. - **Deposits:** - **Type 0**: Normal reward deposit (transfer to contract, allocated to project vault). - **Type 1**: RAMFee (memo "RAMFee"). - **Type 2**: Manual deposit (accounting only) - when the vault is already funded and you only want to raise the internal limit. - **Refund:** For type 0 and type 1 deposits you can request refunds (for the part not yet paid out). - **Claims & wallets:** Per pool you see the list of claims and wallets (with cooldown/status); export is available. - **Claim calculator:** Before saving or after selecting a pool you can get an estimate of eligibility and amounts (eligible NFTs/wallets, already claimed, remaining) - useful for planning reward and RAM budget. --- ## 7. Claim app (nftrewards_claim) - The **claim app** is the frontend for **end users** (NFT holders). - Users connect their wallet (e.g. WebAuth, Anchor) on the XPR Network. - The app shows projects and pools; for the connected wallet it determines eligible NFTs and eligible pools (reward, promotion, survey, streak). - The user selects a pool and clicks "Claim"; the signature is sent to the contract and rewards are transferred to the user's wallet. - For project owners: descriptions and images of projects/pools come from admin configuration and are shown here. Clear pool descriptions and good images improve the user experience. --- ## 7a. End user perspective: claiming rewards and participating This section describes the NFT Claim Hub from the point of view of the **end user** - the person who holds NFTs, claims rewards, participates in surveys, or joins promotions. No admin access is required. ### What you need as a user - A **wallet** on the XPR Network, e.g. WebAuth, Anchor, or another supported wallet. - **NFTs** in that wallet if the reward or promotion requires holding a specific collection (the claim app checks your wallet and shows only what you are eligible for). - For surveys: no NFT is required to vote; eligibility to claim a survey reward depends on the project (e.g. all participants, only certain answers, or only drawn winners). ### Claiming rewards (reward pools) - Open the **claim app** (nftrewards_claim) and **connect your wallet**. - The app lists **projects** and **pools**. For each pool you see the reward amount, token, description and image. Pools where you are **eligible** are highlighted or marked (e.g. you hold at least one NFT from the required collection and satisfy any extra rules). - Click **Claim** on an eligible pool. Your wallet will ask you to **sign a transaction**; the contract then sends the reward tokens to your wallet. No reward is sent without your signature. - **Cooldown**: Some pools allow only one claim per wallet ever, or one claim per day. If you already claimed, the app will show when you can claim again (or that the pool is "once per wallet" and you have already claimed). - **Per-NFT vs per-wallet**: In reward pools with cooldown 0 you may get one reward per eligible NFT; with cooldown or "forever" it is usually one reward per wallet per pool. The pool description and the app indicate the reward amount you will receive. ### Participating in surveys - In the claim app, **surveys** appear as a separate category. Open a survey to see the **question** and **answer options** (e.g. 2 to 6 options). - **Vote** by selecting one or more options (if multiple choice is allowed) and confirm. Your vote is recorded on-chain. - **Claiming a survey reward** depends on the survey type set by the project: - **Normal**: Every participant can claim the survey reward (one claim per wallet). After voting, the corresponding survey pool becomes claimable for you. - **Answer-based**: Only participants who chose specific options can claim. If your answer is among the required ones, you can claim; otherwise you cannot. - **Raffle**: Only **drawn winners** can claim. The project draws winners after the survey ends; only those accounts see the survey pool as claimable. If you did not win, you cannot claim this reward. - You do **not** need to hold an NFT to vote; eligibility to **claim** may still depend on the project (e.g. some survey pools are for NFT holders only, others for any participant). ### Taking part in promotions - **Promotions** are time-limited and often limited in the number of claims (e.g. "first 500"). - In the claim app, if a promotion is active and you meet the conditions (e.g. you hold an NFT from the required collection, or the promotion is open to any account), you will see the promotion pool and the reward amount. - **Claim** once per wallet before the promotion ends or the claim limit is reached. After that, the promotion may show as "Finished" and no further claims are possible. - There is no separate "registration"; eligibility is checked at claim time based on your wallet and the rules set by the project. ### Streaks - **Streaks** reward you for completing a streak (e.g. 7 days in a row active, as defined by the project). - The project or a linked system records when you complete the streak. Once your wallet is marked as having completed the streak, the **streak pool** becomes claimable for you in the claim app. - You **claim** the streak reward like any other pool: connect wallet, open the streak pool, click Claim, sign. Usually one claim per wallet per streak completion; some projects allow repeatable streaks after a cooldown. ### What you see in the claim app - **Projects and pools**: Names, descriptions and images set by the project. Reward amount and token (e.g. "1000 CYPHR", "5 CYPHR") are shown per pool. - **Eligibility**: The app only shows as claimable what your connected wallet is eligible for (right NFTs, survey participation or winner status, promotion still open, streak completed). - **Already claimed**: If you have already claimed a pool that is "once per wallet", the app will not let you claim again. For pools with a cooldown, you may see when the next claim is possible. ### Tips for users - **Connect the correct wallet**: Rewards are sent to the wallet you use to sign. Use the wallet that holds your NFTs or that you used to participate in a survey. - **One claim per wallet**: Many pools allow only one claim per wallet ever. Make sure you claim before the pool or promotion ends. - **Survey raffles**: If the survey is a raffle, only drawn winners can claim. Participation does not guarantee a reward. - **Time limits**: Promotions and some pools have start and end times. Claim within the active period. - **Transaction fee**: Signing the claim transaction may require a small network fee (depending on the wallet and network). The reward itself is sent by the project's vault; you do not pay for the reward tokens. --- ## 8. Smart contract (nftrewards_contract) - The contract (**nftrewards** on XPR Network) stores and enforces all rules: - Projects, vaults, pools (including type), dependent NFT rules, surveys, survey votes, promotions, streaks, streak state. - Deposits (rewards, RAMFee, manual), RAM budgets and RAM fees. - Claims and wallets per pool. - Allowed tokens, exclusion lists, optional creator fees. - Only the contract performs the eligibility check (collection, attributes, dependent rules, cooldown, limits, survey/promotion/streak status) and the token transfer. Admin and claim app are interfaces; the single source of truth is the contract. --- ## 9. Summary: What does the NFT Claim Hub offer my NFT project? **For project owners (admin):** - **Rewards** for NFT holders by collection and attributes (reward pools), with optional **dependent NFT rules** so rewards are only possible with a **specific combination of NFTs**. - **Time windows** (start/end) and **cooldowns** (daily, once per wallet, etc.). - **Promotions** with a fixed maximum number of claims (e.g. "first 500"). - **Surveys** with rewards for all participants, only certain answers, or raffle winners. - **Streaks** (e.g. 7 days in a row) with configurable reward. - **Transparent accounting**: RAM fee per claim, optional creator fee; vault and deposits visible in admin. - **Self-service configuration** after onboarding: project is created (by platform), then you manage all pools, surveys, promotions and streaks yourself. **For end users (claimers, survey participants):** - **Claim rewards** by connecting a wallet in the claim app, viewing eligible pools, and signing a claim transaction; rewards are sent to the wallet. - **Participate in surveys** by voting on-chain; claim a reward if the survey type allows (all participants, certain answers, or raffle winners only). - **Join promotions** by claiming before the time or claim limit ends, if eligible (e.g. holding the required NFT). - **Claim streak rewards** after completing a streak, once the project has recorded completion. - No admin access needed; eligibility is checked automatically from the connected wallet and on-chain rules. --- ## 10. Guidance: Configuring rewards effectively - **Pools:** - For "claimable daily": reward pool, cooldown 86400. - For "once per holder": set cooldown to maximum. - For "VIPs only" or "specific NFT combination": use a pool with **dependent NFT rules** (e.g. at least 2 NFTs from the same collection, or main collection + at least 1 from another collection). - **NFT dependencies:** - To reward only a specific combination of NFTs, create a reward pool and add one or more dependent rules (reqKey, collection, nftcount, optional required immutable). Only users who hold the main collection **and** satisfy every rule can claim. - **Surveys:** - Simple participation reward: type Normal. - Reward only certain answers: type Answer-based, set required answers. - Giveaway: type Raffle, run "Draw winners" after end. - **Promotions:** - Set a clear maxClaimCount; use time window (start/end); create the pool after creating the promotion. - **Streaks:** - Set target streak days and optionally target in-a-row; set cooldown depending on whether the streak is one-time or repeatable. - **Costs:** - Monitor RAMFee deposit and RAM budget; for many expected claims, add enough RAMFee and adjust budget. - **Vault:** - Fund the vault with enough reward tokens; the contract's permission must be set (by platform operator). --- ## 11. Best practices for projects ### Planning rewards - **Define a total reward budget** (token amount) and time window before creating pools. Use the claim calculator to estimate eligible NFTs/wallets and multiply by reward per claim to get a rough total. - **Start with one pool type** (e.g. a single reward pool) and add promotion/survey/streak pools once the basics work. - **Use time windows** (startTimeSec, endTimeSec) for campaigns so you can stop claims without deactivating the pool manually. - **Prefer "once per wallet" (max cooldown)** for one-off campaigns to avoid multi-account farming; use per-NFT or short cooldowns only when you want repeated engagement. ### Calculating RAM costs - Each claim writes on-chain state; the contract charges a **RAM fee per claim** in the project's configured token. Formula: **total RAM cost = (expected number of claims) x (fee per claim)**. - Before launch: estimate max claims (e.g. number of holders x claims per holder), then: (1) fund a **RAMFee deposit** (transfer to contract with memo "RAMFee") and (2) set **RAM budget** to the number of claim slots you allow. Use "Use max" in the admin to derive budget from your RAMFee balance. - Reserve RAM fee in the same token as configured for the project (see RAM Fees card in admin). Refill RAMFee and increase budget when you extend campaigns. ### Preventing abuse - **Cooldowns**: Use cooldown > 0 or maximum so one wallet cannot claim repeatedly in a short time. - **Dependent NFT rules**: Require a minimum number of NFTs (e.g. 2+ from the same collection) to reduce single-NFT farming. - **Excluded assets**: Add specific asset IDs to the project's excluded list if certain NFTs are banned or exploited. - **Promotions**: Use maxClaimCount to cap total claims; combine with start/end times for time-bound campaigns. - **Surveys (Raffle)**: Use survey type "Raffle" and draw winners so only selected accounts can claim, not every participant. - **Monitor**: Check Claims and Wallets tables per pool for unusual patterns (same wallet, many claims). ### Naming pools sensibly - **Pool key**: Use short, unique, lowercase identifiers with underscores (e.g. `daily_owl`, `vip_bonus_jan`, `survey_q1_raffle`). Avoid spaces and special characters; the key is used in contract actions and URLs. - **Pool description**: Write a clear one-line summary for the claim app (e.g. "Daily 1000 CYPHR for holders" or "One-time bonus for 3+ NFTs"). Users see this when claiming. - **Consistency**: If you have multiple pools, use a naming pattern (e.g. `reward_daily`, `reward_weekly`, `promo_launch`) so you can tell type and purpose from the key. --- ## 12. Example configurations (JSON) These examples illustrate typical payloads for LLMs or integrations. Field names and types match the contract ABI; values are examples only. Reward amounts use **CYPHR** as example token (8 decimal places; symbol "CYPHR", precision 8). Replace rewardTokenContract with the actual CYPHR token contract on XPR Network. ### Reward pool (setpool) ```json { "poolKey": "daily_rewards", "projectId": 1, "collectionName": "mycollection", "reward": "1000.00000000 CYPHR", "rewardTokenContract": "cyphrtokenxx", "active": true, "startTimeSec": 0, "endTimeSec": 0, "cooldownSec": 86400, "requiredImmutable": [], "poolDescription": "Daily 1000 CYPHR per eligible NFT", "poolImageUrl": "https://example.com/pool.png", "poolType": 1 } ``` ### Dependent NFT rule (setreqnftx) ```json { "poolKey": "vip_bonus", "reqKey": "hold_three", "collectionName": "mycollection", "requiredImmutable": [], "nftcount": 3, "active": true } ``` ### Promotion (createpromo / setpromo style) ```json { "promotionName": "first_500", "projectId": 1, "collectionName": "mycollection", "reward": "5.00000000 CYPHR", "rewardTokenContract": "cyphrtokenxx", "startTimeSec": 1704067200, "endTimeSec": 1704153600, "description": "First 500 claimers get 5 CYPHR", "imageUrl": "https://example.com/promo.png", "maxClaimCount": 500, "active": true } ``` ### Survey (setsurvey style) ```json { "surveyKey": "feedback_jan", "projectId": 1, "surveyText": "How do you like the new feature?", "option1": "Great", "option2": "Good", "option3": "Needs work", "numOptions": 3, "allowMultiple": false, "surveyType": 1, "active": true, "closed": false, "startTimeSec": 0, "endTimeSec": 0, "surveyDescription": "Community feedback survey", "surveyImageUrl": "https://example.com/survey.png" } ``` ### Streak (setstreak) ```json { "streakId": "weekly_7", "streakName": "7-day streak", "projectId": 1, "targetStreakDays": 7, "targetInARow": 0, "active": true, "collectionName": "mycollection", "reward": "500.00000000 CYPHR", "rewardTokenContract": "cyphrtokenxx", "cooldownSec": 604800, "poolDescription": "Reward for 7-day streak", "poolImageUrl": "https://example.com/streak.png", "requiredImmutable": [] } ``` --- ## 13. Glossary - **Pool** A reward configuration tied to a project. It defines which collection (and optional attributes) can claim, the reward amount and token, time window, cooldown, and pool type (reward, promotion, survey, streak). Each pool has a unique pool key within the project. - **Vault** The on-chain account that holds reward tokens for a project. When a user claims, the contract transfers the reward from the project's vault to the user's wallet. The vault account and its permission are set per project (e.g. via setpvault) and must allow the nftrewards contract to send tokens. - **RAMFee** A per-claim fee (in tokens) charged by the contract to pay for on-chain RAM used to store claim and wallet records. The project configures a RAM fee and a RAM budget (max number of claims). You fund RAMFee by transferring the fee token to the contract with memo "RAMFee" (type 1 deposit), then set the budget in the admin. - **Dependent rule (Dependent NFT rule)** An extra requirement attached to a reward pool: the wallet must hold at least N NFTs from a specified collection (optionally matching required immutable attributes). All active dependent rules must be satisfied in addition to the pool's main collection for a claim to succeed. Used to gate rewards on a specific combination of NFTs. - **Required immutable** A list of attribute filters (e.g. `rarity=legendary`) that an NFT must match. Used in the pool (for the main collection) and in dependent rules (for the rule's collection). Only NFTs that have these immutable data fields on-chain are counted as eligible. - **Cooldown** The minimum time in seconds between two claims from the same wallet for the same pool. Cooldown 0 allows repeated claims (e.g. per NFT); a large value (e.g. 86400 for 24 hours) limits frequency; the maximum value (contract constant) means one claim per wallet per pool ever ("forever" cooldown). --- ## 14. Operator The NFT Claim Hub is operated by **Bloxprod**. Website: https://bloxprod.io --- This llms.txt describes the NFT Claim Hub from the NFT project owner's perspective and supports AI agents and projects in understanding and configuring the admin, claim app and contract.