Event Building

A convenient way to create events is by using the EventBuilder. It allows to build standard and/or custom events.

Construct the event

Standard events can be composed by using the dedicated constructors. In the below example we are going to build a text note:

Rust
let builder = EventBuilder::text_note("Hello");
Python
builder1 = EventBuilder.text_note("Hello")
JavaScript
let builder1 = EventBuilder.textNote("Hello");
Kotlin
val builder1 = EventBuilder.textNote("Hello")
Swift
let builder1 = EventBuilder.textNote(content: "Hello")
Flutter
EventBuilder builder1 = EventBuilder.textNote(content: "Hello");

You can also customize the builder, for example, by specifying a POW difficulty, setting a fixed timestamp or adding more tags:

Rust
let builder =
    EventBuilder::text_note("Hello with POW")
        .tag(Tag::alt("POW text-note"))
        .pow(20)
        .custom_created_at(Timestamp::from_secs(1737976769));
Python
tag = Tag.alt("POW text-note")
custom_timestamp = Timestamp.from_secs(1737976769)
builder2 = EventBuilder.text_note("Hello with POW").tags([tag]).pow(20).custom_created_at(custom_timestamp)
JavaScript
let builder2 =
    EventBuilder.textNote("Hello with POW")
        .tags([Tag.alt("POW text-note")])
        .pow(20)
        .customCreatedAt(Timestamp.fromSecs(1737976769));
Kotlin
val tag = Tag.alt("POW text-note")
val builder2 =
    EventBuilder.textNote("Hello with POW")
        .tags(listOf(tag))
        .pow(20u)
        .customCreatedAt(Timestamp.fromSecs(1737976769u))
Swift
let tag = Tag.alt(summary: "POW text-note")
let timestamp = Timestamp.fromSecs(secs: 1737976769)
let builder2 = EventBuilder.textNote(content: "Hello with POW")
    .tags(tags: [tag])
    .pow(difficulty: 20)
    .customCreatedAt(createdAt: timestamp)

Flutter
Tag tag = Tag.parse(tag: ["client", "rust-nostr"]);
EventBuilder builder2 =
    EventBuilder.textNote(content: "Hello with POW")
    .tag(tag: tag)
    .pow(difficulty: 20)
    .customCreatedAt(createdAt: BigInt.from(1737976769));

If you need to create a non-standard event, you can use the default EventBuilder constructor:

Rust
let builder = EventBuilder::new(Kind::Custom(33001), "My custom event");
Python
kind = Kind(33001)
builder3 = EventBuilder(kind, "My custom event")
JavaScript
let kind = new Kind(33001);
let builder3 = new EventBuilder(kind, "My custom event");
Kotlin
val kind = Kind(33001u)
val builder3 =EventBuilder(kind = kind, content = "My custom event")
Swift
let kind = Kind(kind: 33001)
let builder3 = EventBuilder(kind: kind, content: "My custom event")
Flutter
EventBuilder builder3 = EventBuilder(kind: 33001, content: "My custom event");

Build and sign the event

After the EventBuilder construction, you can finally build and sign the event:

Rust
let event: Event = builder.sign(signer).await?;
Python
event = await builder.sign(signer)
JavaScript
let event = await builder.sign(signer);
Kotlin
val event: Event = builder.sign(signer)
Swift
let event = try await builder.sign(signer: signer)
Flutter
Event event = await builder.sign(signer);

Full example

Rust
use nostr_sdk::prelude::*;

async fn sign_and_print<T>(signer: &T, builder: EventBuilder) -> Result<()> 
where
    T: NostrSigner,
{
    let event: Event = builder.sign(signer).await?;
    
    println!("{}", event.as_json());
    
    Ok(())
}

pub async fn event() -> Result<()> {
    let keys = Keys::generate();

    let builder = EventBuilder::text_note("Hello");
    
    sign_and_print(&keys, builder).await?;

    let builder =
        EventBuilder::text_note("Hello with POW")
            .tag(Tag::alt("POW text-note"))
            .pow(20)
            .custom_created_at(Timestamp::from_secs(1737976769));

    sign_and_print(&keys, builder).await?;

    let builder = EventBuilder::new(Kind::Custom(33001), "My custom event");

    sign_and_print(&keys, builder).await
}
Python
from nostr_sdk import Keys, EventBuilder, Kind, Tag, NostrSigner, Timestamp


async def sign_and_print(signer: NostrSigner, builder: EventBuilder):
    event = await builder.sign(signer)

    print(event.as_json())


async def event_builder():
    keys = Keys.generate()
    signer = NostrSigner.keys(keys)

    builder1 = EventBuilder.text_note("Hello")

    await sign_and_print(signer, builder1)

    tag = Tag.alt("POW text-note")
    custom_timestamp = Timestamp.from_secs(1737976769)
    builder2 = EventBuilder.text_note("Hello with POW").tags([tag]).pow(20).custom_created_at(custom_timestamp)

    await sign_and_print(signer, builder2)

    kind = Kind(33001)
    builder3 = EventBuilder(kind, "My custom event")

    await sign_and_print(signer, builder3)

JavaScript
import {Keys, EventBuilder, Tag, Timestamp, Kind, loadWasmSync, NostrSigner} from "@rust-nostr/nostr-sdk"

async function signAndPrint(signer: NostrSigner, builder: EventBuilder) {
    let event = await builder.sign(signer);

    console.log(event.asJson())
}

async function run() {
    // Load WASM
    loadWasmSync();

    let keys = Keys.generate();
    let signer = NostrSigner.keys(keys);

    let builder1 = EventBuilder.textNote("Hello");

    await signAndPrint(signer, builder1);

    let builder2 =
        EventBuilder.textNote("Hello with POW")
            .tags([Tag.alt("POW text-note")])
            .pow(20)
            .customCreatedAt(Timestamp.fromSecs(1737976769));

    await signAndPrint(signer, builder2);

    let kind = new Kind(33001);
    let builder3 = new EventBuilder(kind, "My custom event");

    await signAndPrint(signer, builder3);
}

run();
Kotlin
import kotlinx.coroutines.runBlocking
import rust.nostr.sdk.Event
import rust.nostr.sdk.EventBuilder
import rust.nostr.sdk.Keys
import rust.nostr.sdk.Kind
import rust.nostr.sdk.NostrSigner
import rust.nostr.sdk.Tag
import rust.nostr.sdk.Timestamp

suspend fun signAndPrint(signer: NostrSigner, builder: EventBuilder) {
    val event: Event = builder.sign(signer)

    print(event.asJson())
}

suspend fun builder() {
    val keys = Keys.generate()
    val signer = NostrSigner.keys(keys)

    val builder1 = EventBuilder.textNote("Hello")

    signAndPrint(signer, builder1)

    val tag = Tag.alt("POW text-note")
    val builder2 =
        EventBuilder.textNote("Hello with POW")
            .tags(listOf(tag))
            .pow(20u)
            .customCreatedAt(Timestamp.fromSecs(1737976769u))

    signAndPrint(signer, builder2)

    val kind = Kind(33001u)
    val builder3 =EventBuilder(kind = kind, content = "My custom event")

    signAndPrint(signer, builder3)
}

fun main() {
    runBlocking { builder() }
}
Swift
import NostrSDK
import Foundation

func signAndPrint(signer: NostrSigner, builder: EventBuilder) async throws {
    let event = try await builder.sign(signer: signer)

    print(try event.asJson())
}

func builder() async throws{
    let keys = Keys.generate()
    let signer = NostrSigner.keys(keys: keys)

    let builder1 = EventBuilder.textNote(content: "Hello")

    try await signAndPrint(signer: signer, builder: builder1)

    let tag = Tag.alt(summary: "POW text-note")
    let timestamp = Timestamp.fromSecs(secs: 1737976769)
    let builder2 = EventBuilder.textNote(content: "Hello with POW")
        .tags(tags: [tag])
        .pow(difficulty: 20)
        .customCreatedAt(createdAt: timestamp)


    try await signAndPrint(signer: signer, builder: builder2)

    let kind = Kind(kind: 33001)
    let builder3 = EventBuilder(kind: kind, content: "My custom event")

    try await signAndPrint(signer: signer, builder: builder3)
}
Flutter
import 'package:nostr_sdk/nostr_sdk.dart';

Future<void> signAndPrint({signer = NostrSigner, builder = EventBuilder}) async {
    Event event = await builder.sign(signer);

    print(event.asJson());
}

Future<void> event() async {
    Keys keys = Keys.generate();
    NostrSigner signer = NostrSigner.keys(keys: keys);

    EventBuilder builder1 = EventBuilder.textNote(content: "Hello");

    await signAndPrint(signer: signer, builder: builder1);

    Tag tag = Tag.parse(tag: ["client", "rust-nostr"]);
    EventBuilder builder2 =
        EventBuilder.textNote(content: "Hello with POW")
        .tag(tag: tag)
        .pow(difficulty: 20)
        .customCreatedAt(createdAt: BigInt.from(1737976769));

    await signAndPrint(signer: signer, builder: builder2);

    EventBuilder builder3 = EventBuilder(kind: 33001, content: "My custom event");

    await signAndPrint(signer: signer, builder: builder3);
}