Lewati ke konten utama

Contoh: Buat Rule NFT

Source: examples/simple/rule.nft/create-rule-item.ts

Script ini melakukan 3 hal: subscribe (kalau belum) → createRule → activateRule.


Step 1 — Definisikan Rule

export const RULE_OBJECT = {
id: 'min_amount',
if: { field: 'tx.amount', op: '>=', value: '100000000' },
message: 'Minimum 100 USDC',
};

Step 2 — Upload ke IPFS

bun run setup:upload

Step 3 — Subscribe + Buat + Aktifkan

bun run setup:create-rule
// Cek subscription
const hasActive = await ruleNFT.getFunction("hasActiveSubscription")(receiverWallet.address);
if (!hasActive) {
const price = await ruleNFT.getFunction("subscriptionPriceETH")();
await (await ruleNFT.getFunction("subscribe").send({ value: price })).wait();
}

// createRule
const ruleHash = keccak256(toUtf8Bytes(canonicalize(RULE_OBJECT)));
const txCreate = await ruleNFT.getFunction("createRule").send(ruleHash, tokenURI);
const receipt = await txCreate.wait();
// Extract ruleId dari event RuleCreated

// activateRule → mint NFT
await (await ruleNFT.getFunction("activateRule").send(ruleId)).wait();
const tokenId = await ruleNFT.getFunction("ruleTokenId")(ruleId);

Batas Slot Rule

StatusMaksimal Rule NFT
Tanpa langganan1 slot
Dengan langganan3 slot (MAX_SLOT)

Step 4 — Perpanjang Expiry Rule

const newExpiry = BigInt(Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60);
const price = await ruleNFT.getFunction("subscriptionPriceETH")();
await (await ruleNFT.getFunction("extendRuleExpiry").send(tokenId, newExpiry, { value: price })).wait();
Expiry ≠ Langganan

Expiry Rule NFT dan expiry langganan adalah hal yang terpisah. Perpanjang langganan tidak otomatis memperpanjang Rule NFT — kamu harus panggil extendRuleExpiry(tokenId, newExpiry) untuk setiap token.