-
@ BlockNostr
2025-05-11 21:28:47// SPDX-License-Identifier: GPL-3.0 Contract PaidMessage( owner: Address, // who collects the fee mut message: ByteVec // last posted message ) { // ── Events ──────────────────────────────────────────────────────────────── /// Fires whenever someone pays and posts a new message event MessageSent(sender: Address, content: ByteVec)
// ── Constants ───────────────────────────────────────────────────────────── /// 0.1 ALPH in atto-ALPH const PRICE = 100000000000000000 /// Maximum allowed message length const MAX_MESSAGE_SIZE = 1024 /// Dust amount for transactions (0.001 ALPH in atto-ALPH) const DUST_AMOUNT = 1000000000000000 // ── Error codes ─────────────────────────────────────────────────────────── enum ErrorCodes { InvalidMessageSize = 0 InsufficientPayment = 1 InvalidCaller = 2 } // ── Read-only helper ────────────────────────────────────────────────────── /// Read back the current message pub fn getMessage() -> ByteVec { return message } // ── Core logic ──────────────────────────────────────────────────────────── /// Requires caller to attach ≥ `PRICE` atto-ALPH, updates message, forwards fee @using(preapprovedAssets = true, updateFields = true, payToContractOnly = false) pub fn sendMessage(newMessage: ByteVec) -> () { // 1️⃣ Check external caller checkCaller!(isAssetAddress!(callerAddress!()), ErrorCodes.InvalidCaller) // 2️⃣ Size check assert!(size!(newMessage) <= MAX_MESSAGE_SIZE, ErrorCodes.InvalidMessageSize) // 3️⃣ Payment check let paid = tokenRemaining!(callerAddress!(), ALPH) assert!(paid >= PRICE, ErrorCodes.InsufficientPayment) // 4️⃣ Update on-chain message message = newMessage // 5️⃣ Transfer exact fee to owner transferToken!(callerAddress!(), owner, ALPH, PRICE) // 6️⃣ Refund excess to caller if above dust amount let change = paid - PRICE if (change >= DUST_AMOUNT) { transferToken!(callerAddress!(), callerAddress!(), ALPH, change) } // 7️⃣ Emit event emit MessageSent(callerAddress!(), newMessage) } // ── Owner-only function ─────────────────────────────────────────────────── /// Allows owner to update the message without payment @using(updateFields = true) pub fn updateMessageByOwner(newMessage: ByteVec) -> () { // 1️⃣ Check if caller is owner checkCaller!(callerAddress!() == owner, ErrorCodes.InvalidCaller) // 2️⃣ Size check assert!(size!(newMessage) <= MAX_MESSAGE_SIZE, ErrorCodes.InvalidMessageSize) // 3️⃣ Update message message = newMessage // 4️⃣ Emit event emit MessageSent(callerAddress!(), newMessage) }
}