{"actions":{"claimRefund":{"availableWhen":"refundActive() == true","effect":"Transfers refundUsdt(yourAddress) USDT to your wallet and zeroes the record. Claimable forever; there is no deadline and nobody can sweep unclaimed funds.","function":"claimRefund()","gasNote":"Normal transaction; call it from the same wallet that minted.","precondition":"refundActive() == true","signature":"claimRefund()"},"claimSocial":{"availableWhen":"You hold a valid, unexpired voucher for the task and have not already claimed it with this Agent ID.","effect":"extraQuota[yourAgentId] increases by 1 per task. Max 3 quota from social tasks (maxTotal 33).","function":"claimSocial(bytes32 task, bytes32 account, uint256 deadline, bytes signature)","obtainingVouchers":"Vouchers are issued automatically by the verification service after it verifies the action through the human's automatic verification flows (X OAuth for the two X tasks, the Telegram bot deep link for the Telegram task). There is no manual issuance and no way to mint a voucher yourself; an invalid or expired signature reverts (BadSignature).","parameters":{"account":"bytes32 identifier of your social account, exactly as bound in the voucher. For X and Telegram accounts alike it is the keccak256 hash of the account's numeric platform user ID, as issued by the verification service.","deadline":"unix timestamp (seconds); the voucher is invalid after this time.","signature":"65-byte EIP-712 signature from the quotaSigner over (user, task, account, deadline). Obtain the voucher from the verification service after the action has been verified. You cannot self-issue a voucher.","task":"keccak256(\"FOLLOW\"), keccak256(\"QUOTE_TWEET\"), or keccak256(\"JOIN_TELEGRAM\")"},"prerequisite":"A signed voucher from the quotaSigner (see preconditions.obtainingVouchers).","signature":"claimSocial(bytes32,bytes32,uint256,bytes)","voucherShape":"The voucher is the tuple (user, task, account, deadline) plus the quotaSigner's EIP-712 signature over it. user is the claiming wallet."},"mintBnb":{"effect":"Same as mintUsdt, paid in BNB. The contract converts the BNB to USDT internally at the Chainlink BNB/USD feed price with 1 percent headroom.","function":"mintWithBnb(uint256 shares, address referrer, uint256 maxCost)","parameters":{"maxCost":"Set it to the exact bnbQuote(you, shares) result and send the same amount as the transaction value.","referrer":"Same rule as mintUsdt.","shares":"1 to 10 per transaction (MAX_PER_TX). Also bounded by your remaining quota."},"shortfallRule":"All conversion friction is borne by you: if the converted amount falls short of the USDT cost the transaction reverts (SwapShort) and no BNB is taken.","signature":"mintWithBnb(uint256,address,uint256)","surplusRule":"Any surplus above the cost goes to escrow and then to the treasury at opening. The USDT value recorded at payment time is your refund basis if genesis fails.","valueRule":"Send the bnbQuote(you, shares) amount as the transaction value; it already includes the 1 percent headroom. A stale or out-of-range feed reading makes bnbQuote revert (StalePrice)."},"mintUsdt":{"approvalRule":"Before calling, approve the mint contract to spend exactly quote(you, shares) USDT. The contract pulls the exact cost via transferFrom. Send no transaction value.","effect":"Mints shares to your wallet. The first genesis share of an Agent ID is free while freeSharesGiven() < 3333. Referral credit is evaluated on this call if the payment is non-zero (first paid mint only).","function":"mint(uint256 shares, address referrer, uint256 maxCost)","maxCostRule":"Set maxCost to the exact quote(you, shares) result. The transaction reverts if the cost at execution exceeds maxCost.","parameters":{"maxCost":"Slippage guard in USDT (18 decimals). Set it to the exact quote(you, shares) result. The transaction reverts if the cost at execution exceeds maxCost.","referrer":"Wallet address of your referrer, or the zero address 0x0000000000000000000000000000000000000000. It matters only on your first paid mint: that is the only call where referral credit can be granted. Self-referral and same-ID referral are rejected.","shares":"1 to 10 per transaction (MAX_PER_TX). Also bounded by your remaining quota."},"signature":"mint(uint256,address,uint256)"}},"audience":"AI agents and agent operators executing or evaluating the Razor Agent genesis mint on behalf of a wallet.","chainId":56,"contracts":{"lpVault":{"address":"0x60FdE00670006d3499825B95B538E59AdEA3982E","functions":["state()","releaseTime()","beginSunset()","cancelSunset()","release()","beneficiary()","lpToken()","sunsetStartedAt()","released()","NOTICE_PERIOD()"],"name":"RazorLpVault"},"mint":{"address":"0x10E80B0365A3b5e3DD66f55E05A748D0BB031fA1","functions":["mint(uint256,address,uint256)","mintWithBnb(uint256,address,uint256)","claimSocial(bytes32,bytes32,uint256,bytes)","claimRefund()","startGenesis()","setPaused(bool)","renounce()","setPoolBlocked(address,bool)","swapTax()","swapTaxSelf()","quote(address,uint256)","bnbQuote(address,uint256)","priceCents(uint256)","quotaOf(uint256)","deadline()","refundActive()","opened()","reserves()","circulating()","floorValue()","ceilValue()","totalMinted()","totalPaid()","genesisStarted()","genesisStart()","paused()","freeSharesGiven()","escrowedCut()","pendingUsdt()","pendingTokens()","mintedCount(uint256)","extraQuota(uint256)","freeUsed(uint256)","socialDone(uint256,bytes32)","accountAgent(bytes32)","refundUsdt(address)","inviteEarned(uint256)","quotaSigner()","treasury()","token()","lpVault()","registrar()"],"name":"RazorMint"},"token":{"address":"0xD5c03f871A34a01373d68ee38f6e67AC195cd66B","functions":["name()","symbol()","decimals()","totalSupply()","balanceOf(address)","transfer(address,uint256)","approve(address,uint256)","allowance(address,address)","transferFrom(address,address,uint256)","MAX_SUPPLY()","rejects(address)","pair()","usdt()"],"name":"RazorToken"}},"failureHandling":{"genesisFailed":{"detect":"genesisStarted() == true AND opened() == false AND current block timestamp > deadline(); equivalently, refundActive() == true.","meaning":"Genesis did not reach 10,000 shares inside the deadline. Minting is closed.","treasuryReceived":0},"notAnAgentIdHolder":{"detect":"handleOf(you) returns an empty string, or quote(you, shares) reverts with NoAgent.","meaning":"The wallet holds no Binance Agent ID. No mint is possible from this wallet."},"referrer":"Ignored unless it resolves to a valid Agent ID different from yours, and ignored once your first paid mint has happened. A free mint never credits and never binds.","sharesTooMany":"shares == 0 or shares > 10 reverts (BadShares). Split larger buys into multiple transactions, each within your remaining quota.","soldOut":"totalMinted() + shares > 4,444,000 reverts (SoldOut). No further minting is possible, ever."},"guardrails":["Verify the chain id is 56 (BNB Smart Chain) before any call.","Verify every contract address against this pack and params.json; never interact with an address that appears in neither.","Stop if the mint address is unset. Unset means not deployed; there is nothing to interact with.","Resolve the Agent ID first. A wallet with no Agent ID cannot mint, and quotes for it revert.","Check the state views before acting: started, paused, opened, refund state, deadline, and remaining quota decide what is possible.","Respect maxCost: set it to the exact contract quote. For USDT, approve exactly the quoted amount. For BNB, the transaction value is the bnbQuote result and is passed as maxCost in the same amount.","If refunds are active, never mint. Claim the recorded refund instead, from the same wallet that paid.","Respect the human's budget: never spend more than the operator authorized, in total, across all transactions.","Verify after every step: minted count, token balance, and the invariants in this pack.","Social quota comes only from signed vouchers issued after automatic verification. An agent cannot issue or forge a voucher; an invalid or expired one reverts."],"invariants":["Minting is impossible before startGenesis() has been called: genesisStarted() == false means every mint reverts (NotStarted).","Minting is impossible while paused() == true; the deadline you read from deadline() already includes the pause extension.","While genesis is running: deadline() - genesisStart() == 10 days + total pause time (pause total is capped at 48 hours).","If totalMinted() reaches 10,000, opened() becomes true in that same transaction and escrow is settled: pendingUsdt() and escrowedCut() go to zero, the pool exists, and refunds become impossible.","If refundActive() == true, every wallet that paid has refundUsdt(wallet) > 0 unless it never paid or already claimed.","quotaOf(id) never exceeds 33; mintedCount(id) never exceeds quotaOf(id).","freeSharesGiven() never exceeds 3,333.","The treasury Safe balance receives genesis funds only at or after opening, never during genesis."],"links":{"agentPack":"https://razoragent.fun/agent-pack.json","explorer":"https://bscscan.com","explorerAddressBase":"https://bscscan.com/address/","params":"https://razoragent.fun/params.json","site":"https://razoragent.fun","telegram":"https://t.me/razoragentai","x":"https://x.com/Razor_Agent"},"postconditions":{"afterFailedGenesisRefund":"claimRefund() transfers your full recorded amount in USDT: the exact USDT paid, or the recorded USDT conversion value for BNB payments. Your refundUsdt balance becomes 0.","afterMint":"mintedCount(yourAgentId) increased by shares; totalMinted() increased by shares; you hold shares x 50,000,000 RZAG (non-transferable until the pool opens).","afterOpen":"Tokens become transferable; trading is possible only via the official pair; post-open minting continues, paid in USDT or BNB the same way. A post-open mint pays the ladder price for each share, and the tokens issued are priced against the live pool at 99 percent of the pool spot price, so the buyer receives about 1 percent more tokens than the same payment converted at spot."},"preconditions":{"agentId":{"definition":"Agent ID = uint256(keccak256(bytes(handle))), where handle is the string returned by the registrar for your wallet.","howToCheck":"Call handleOf(yourAddress) on the Agent ID registrar. An empty string means the wallet holds no Agent ID and cannot mint. Quota and claim functions key off this ID, not your address.","required":true},"contracts":"Read the addresses from the contracts group of this pack and cross-check them in params.json. An empty address means not yet deployed. Do not interact with any Razor Agent contract whose address does not appear in params.json / on razoragent.fun.","funds":{"gas":"A small amount of BNB for gas, separate from the mint payment.","payment":"Either USDT (BEP-20) in the minting wallet plus an ERC-20 approval for the mint contract covering exactly the quoted amount, or BNB sent as the transaction value of mintWithBnb."},"obtainingVouchers":{"note":"For the social-task quota claims only. Vouchers are issued automatically by the verification service after it verifies the action (X tasks via OAuth checks on your own account; the Telegram task via the project bot's membership lookup). There is no manual issuance and no way to mint a voucher yourself; an invalid or expired signature reverts (BadSignature).","quotaSigner":"0xa7F6091B833Dd3db57293b49cB6c24CA0c487CD9"},"stateChecksBeforeMinting":["genesisStarted() == true","opened() == false if you intend to mint at genesis terms; if opened() == true the ladder price applies","paused() == false","current timestamp <= deadline() (only binds before opening)","your remaining quota: quotaOf(agentId) - mintedCount(agentId) >= shares","if you want the free first share: freeUsed(agentId) == false AND freeSharesGiven() < 3333"]},"priceDiscovery":{"postOpenTerms":"After opening, the payment for each share is still its ladder price (priceCents), and quote(you, shares) returns that exact USDT amount due. The tokens issued for a post-open share are not the fixed genesis amount of 50,000,000 RZAG: the contract prices them against the live pool reserves at 99 percent of the pool spot price (MINT_PRICE_BPS = 9900), so the buyer receives about 1 percent more tokens than the same payment converted at spot. Verify the received amount from your token balance after the mint.","quote":"quote(you, shares) -> the exact USDT amount due (18 decimals). Approve the mint contract for exactly this amount and pass it as maxCost to mintUsdt. For BNB: bnbQuote(you, shares) -> the exact BNB amount (18 decimals); send it as the transaction value and pass it as maxCost to mintBnb. bnbQuote reverts with StalePrice when the Chainlink BNB/USD reading is stale or out of range.","sharePrice":"priceCents(n) -> price in USD cents of share number n (1-based). Genesis shares cost 115. Note quote() can be lower than shares x 115 during genesis if your free first share is included."},"project":"Razor Agent","quotaRules":{"base":10,"inviteCap":20,"maxPerTx":10,"maxTotal":33,"socialMax":3,"socialTasks":["FOLLOW","QUOTE_TWEET","JOIN_TELEGRAM"]},"referralRules":{"binding":"The inviter is bound at the invitee's first paid mint. A credited invite requires the invitee's Agent ID to have never minted before that mint; the inviter record is then permanent.","commission":"None. Referral rewards are quota only; no money flows to referrers.","creditRule":"firstPaidMintOnly","freeMintEarnsPoints":false,"howItWorks":"Pass the referrer's wallet address as the referrer argument of the mint call. When the invitee completes their FIRST PAID mint, the referrer earns +1 quota. A free mint never credits and never binds.","inviteCap":20},"rpcUrls":["https://bsc-dataseed.binance.org","https://bsc-dataseed1.defibit.io","https://bsc-dataseed1.ninicoin.io","https://rpc.ankr.com/bsc"],"sequence":["1. Fetch https://razoragent.fun/params.json and read the current contract addresses and parameters. Stop if the mint address is empty.","2. Resolve your Agent ID: handleOf(you) on the registrar; agentId = uint256(keccak256(handle)). Stop if the handle is empty.","3. Read genesis state on RazorMint: genesisStarted(), paused(), opened(), refundActive(), totalMinted(), deadline().","4. If refundActive() is true: skip minting. If refundUsdt(you) > 0, call claimRefund() and stop.","5. If genesisStarted() is false or paused() is true: do not mint; re-check later.","6. Read your quota: quotaOf(agentId) and mintedCount(agentId). Choose shares <= min(10, quotaOf - mintedCount).","7a. USDT path: cost = quote(you, shares), the exact USDT amount due (18 decimals). Approve the mint contract to spend exactly cost USDT, then send mint(shares, referrer, cost). The contract pulls the USDT via transferFrom; send no transaction value. referrer is a wallet address or the zero address.","7b. BNB path (optional): bnb = bnbQuote(you, shares). Send mintWithBnb(shares, referrer, bnb) with the transaction value set to bnb. All conversion friction is yours: a shortfall reverts (SwapShort) with no BNB taken; a stale feed reverts (StalePrice).","8. Verify the result: your mintedCount increased by shares and you received shares x 50,000,000 RZAG.","9. Optional quota growth: invite others (credit lands automatically on their first paid mint; your invite credit is capped at +20) and complete the three social tasks via claimSocial with a valid voucher (follow @Razor_Agent; like and quote-tweet the official announcement post; join the project Telegram).","10. When totalMinted() reaches 10,000 the pool opens in the same transaction; after opened() == true, tokens are transferable and ladder minting continues."],"stateViews":[{"contract":"mint","meaning":"Shares minted so far across all Agent IDs.","view":"totalMinted()"},{"contract":"mint","meaning":"Shares that were paid for; free shares are not counted.","view":"totalPaid()"},{"contract":"mint","meaning":"True once startGenesis() has been called.","view":"genesisStarted()"},{"contract":"mint","meaning":"Unix timestamp at which genesis started.","view":"genesisStart()"},{"contract":"mint","meaning":"Current genesis deadline as a unix timestamp; pause time is already added.","view":"deadline()"},{"contract":"mint","meaning":"True while the deployer pause is active; pre-open only.","view":"paused()"},{"contract":"mint","meaning":"True once the pool has opened at 10,000 shares.","view":"opened()"},{"contract":"mint","meaning":"True when genesis failed and refunds are claimable.","view":"refundActive()"},{"contract":"mint","meaning":"Free first shares granted so far, against the 3,333 cap.","view":"freeSharesGiven()"},{"contract":"mint","meaning":"Treasury cut currently held in escrow inside the mint contract.","view":"escrowedCut()"},{"contract":"mint","meaning":"USDT currently held in escrow for the pool leg.","view":"pendingUsdt()"},{"contract":"mint","meaning":"Pool-inventory tokens accumulated and not yet settled into the pool.","view":"pendingTokens()"},{"contract":"mint","meaning":"Pool reserves (USDT, token) once the pool is open.","view":"reserves()"},{"contract":"mint","meaning":"Tokens in circulation outside the pool.","view":"circulating()"},{"contract":"mint","meaning":"Floor reference value derived from the pool line.","view":"floorValue()"},{"contract":"mint","meaning":"Ceiling reference value derived from the pool line.","view":"ceilValue()"},{"contract":"registrar","meaning":"The Agent ID handle string for a wallet; an empty string means the wallet holds no Agent ID.","view":"handleOf(address)"},{"contract":"mint","meaning":"Shares minted by an Agent ID.","view":"mintedCount(uint256)"},{"contract":"mint","meaning":"Total quota of an Agent ID: base plus granted extra quota.","view":"quotaOf(uint256)"},{"contract":"mint","meaning":"Extra quota granted to an Agent ID from invites and social tasks.","view":"extraQuota(uint256)"},{"contract":"mint","meaning":"Whether an Agent ID has used its free first share.","view":"freeUsed(uint256)"},{"contract":"mint","meaning":"Whether an Agent ID has already claimed a given social task.","view":"socialDone(uint256,bytes32)"},{"contract":"mint","meaning":"Refund currently due to a wallet in USDT; nonzero only after a failed genesis and before the claim.","view":"refundUsdt(address)"},{"contract":"mint","meaning":"Exact USDT cost (18 decimals) of minting shares for a user, free first share accounted.","view":"quote(address,uint256)"},{"contract":"mint","meaning":"Price in USD cents of share number n (1-based).","view":"priceCents(uint256)"},{"contract":"mint","meaning":"Exact BNB amount (18 decimals) for the BNB mint path, including the 1 percent headroom; reverts StalePrice on a stale or out-of-range feed reading.","view":"bnbQuote(address,uint256)"}],"version":1}