commit f6f034cbe60925de7198e5ec1ed65a5e436007f4
parent 9908f5d0f4e2a3456395f9e528c3108d3ffa8d35
Author: triesap <tyson@radroots.org>
Date: Mon, 27 Apr 2026 22:07:39 +0000
spec: add active trade order operations
Diffstat:
10 files changed, 266 insertions(+), 0 deletions(-)
diff --git a/spec/conformance/vectors/trade/build_order_decision_draft.v1.json b/spec/conformance/vectors/trade/build_order_decision_draft.v1.json
@@ -0,0 +1,36 @@
+{
+ "suite": "trade",
+ "contract_version": "0.1.0",
+ "vectors": [
+ {
+ "id": "trade_build_order_decision_draft_accept_minimal_001",
+ "kind": "trade.build_order_decision_draft",
+ "input": {
+ "root_event_id": "order-request-event",
+ "prev_event_id": "order-request-event",
+ "payload": {
+ "order_id": "order-1",
+ "listing_addr": "30402:seller_pubkey:AAAAAAAAAAAAAAAAAAAAAg",
+ "buyer_pubkey": "buyer_pubkey",
+ "seller_pubkey": "seller_pubkey",
+ "decision": {
+ "decision": "accepted",
+ "inventory_commitments": [
+ {
+ "bin_id": "bin-1",
+ "bin_count": 2
+ }
+ ]
+ }
+ }
+ },
+ "expected": {
+ "wire_parts": {
+ "kind": 3423,
+ "content_type": "TradeOrderDecision",
+ "tags_shape": "active_trade_order_decision_tags"
+ }
+ }
+ }
+ ]
+}
diff --git a/spec/conformance/vectors/trade/build_order_request_draft.v1.json b/spec/conformance/vectors/trade/build_order_request_draft.v1.json
@@ -0,0 +1,35 @@
+{
+ "suite": "trade",
+ "contract_version": "0.1.0",
+ "vectors": [
+ {
+ "id": "trade_build_order_request_draft_minimal_001",
+ "kind": "trade.build_order_request_draft",
+ "input": {
+ "listing_event": {
+ "id": "listing-snapshot",
+ "relays": "wss://relay.example.com"
+ },
+ "payload": {
+ "order_id": "order-1",
+ "listing_addr": "30402:seller_pubkey:AAAAAAAAAAAAAAAAAAAAAg",
+ "buyer_pubkey": "buyer_pubkey",
+ "seller_pubkey": "seller_pubkey",
+ "items": [
+ {
+ "bin_id": "bin-1",
+ "bin_count": 2
+ }
+ ]
+ }
+ },
+ "expected": {
+ "wire_parts": {
+ "kind": 3422,
+ "content_type": "TradeOrderRequested",
+ "tags_shape": "active_trade_order_request_tags"
+ }
+ }
+ }
+ ]
+}
diff --git a/spec/conformance/vectors/trade/parse_order_decision.v1.json b/spec/conformance/vectors/trade/parse_order_decision.v1.json
@@ -0,0 +1,22 @@
+{
+ "suite": "trade",
+ "contract_version": "0.1.0",
+ "vectors": [
+ {
+ "id": "trade_parse_order_decision_minimal_001",
+ "kind": "trade.parse_order_decision",
+ "input": {
+ "event": {
+ "kind": 3423,
+ "author": "seller_pubkey",
+ "content_type": "TradeOrderDecision",
+ "tags_shape": "active_trade_order_decision_tags"
+ }
+ },
+ "expected": {
+ "envelope_shape": "active_trade_order_decision",
+ "payload_type": "RadrootsTradeOrderDecisionEvent"
+ }
+ }
+ ]
+}
diff --git a/spec/conformance/vectors/trade/parse_order_request.v1.json b/spec/conformance/vectors/trade/parse_order_request.v1.json
@@ -0,0 +1,22 @@
+{
+ "suite": "trade",
+ "contract_version": "0.1.0",
+ "vectors": [
+ {
+ "id": "trade_parse_order_request_minimal_001",
+ "kind": "trade.parse_order_request",
+ "input": {
+ "event": {
+ "kind": 3422,
+ "author": "buyer_pubkey",
+ "content_type": "TradeOrderRequested",
+ "tags_shape": "active_trade_order_request_tags"
+ }
+ },
+ "expected": {
+ "envelope_shape": "active_trade_order_request",
+ "payload_type": "RadrootsTradeOrderRequested"
+ }
+ }
+ ]
+}
diff --git a/spec/operations.toml b/spec/operations.toml
@@ -18,6 +18,13 @@ public = [
"RadrootsFarm",
"RadrootsListing",
"RadrootsTradeEnvelope",
+ "RadrootsActiveTradeEnvelope",
+ "RadrootsActiveTradeMessageType",
+ "RadrootsTradeOrderItem",
+ "RadrootsTradeOrderRequested",
+ "RadrootsTradeInventoryCommitment",
+ "RadrootsTradeOrderDecision",
+ "RadrootsTradeOrderDecisionEvent",
]
[errors]
@@ -164,6 +171,51 @@ rust_types = ["radroots_events::trade::RadrootsTradeEnvelope"]
[operations.trade_build_envelope_draft.conformance]
vector = "spec/conformance/vectors/trade/build_envelope_draft.v1.json"
+[operations.trade_build_order_request_draft]
+domain = "trade"
+id = "trade.build_order_request_draft"
+stability = "beta"
+inputs = ["RadrootsTradeOrderRequested", "RadrootsNostrEventPtr"]
+outputs = ["WireEventParts"]
+error_class = "encode_error"
+deterministic = true
+signing = "native"
+transport = "native"
+
+[operations.trade_build_order_request_draft.implementation]
+rust_modules = ["crates/events_codec/src/trade/encode.rs"]
+rust_types = [
+ "radroots_events::RadrootsNostrEventPtr",
+ "radroots_events::trade::RadrootsTradeOrderRequested",
+]
+
+[operations.trade_build_order_request_draft.conformance]
+vector = "spec/conformance/vectors/trade/build_order_request_draft.v1.json"
+
+[operations.trade_build_order_decision_draft]
+domain = "trade"
+id = "trade.build_order_decision_draft"
+stability = "beta"
+inputs = [
+ "root_event_id",
+ "prev_event_id",
+ "RadrootsTradeOrderDecisionEvent",
+]
+outputs = ["WireEventParts"]
+error_class = "encode_error"
+deterministic = true
+signing = "native"
+transport = "native"
+
+[operations.trade_build_order_decision_draft.implementation]
+rust_modules = ["crates/events_codec/src/trade/encode.rs"]
+rust_types = [
+ "radroots_events::trade::RadrootsTradeOrderDecisionEvent",
+]
+
+[operations.trade_build_order_decision_draft.conformance]
+vector = "spec/conformance/vectors/trade/build_order_decision_draft.v1.json"
+
[operations.trade_parse_envelope]
domain = "trade"
id = "trade.parse_envelope"
@@ -185,6 +237,50 @@ rust_types = [
[operations.trade_parse_envelope.conformance]
vector = "spec/conformance/vectors/trade/parse_envelope.v1.json"
+[operations.trade_parse_order_request]
+domain = "trade"
+id = "trade.parse_order_request"
+stability = "beta"
+inputs = ["RadrootsNostrEvent"]
+outputs = ["RadrootsActiveTradeEnvelope", "RadrootsTradeOrderRequested"]
+error_class = "parse_error"
+deterministic = true
+signing = "native"
+transport = "native"
+
+[operations.trade_parse_order_request.implementation]
+rust_modules = ["crates/events_codec/src/trade/decode.rs"]
+rust_types = [
+ "radroots_events::RadrootsNostrEvent",
+ "radroots_events::trade::RadrootsActiveTradeEnvelope",
+ "radroots_events::trade::RadrootsTradeOrderRequested",
+]
+
+[operations.trade_parse_order_request.conformance]
+vector = "spec/conformance/vectors/trade/parse_order_request.v1.json"
+
+[operations.trade_parse_order_decision]
+domain = "trade"
+id = "trade.parse_order_decision"
+stability = "beta"
+inputs = ["RadrootsNostrEvent"]
+outputs = ["RadrootsActiveTradeEnvelope", "RadrootsTradeOrderDecisionEvent"]
+error_class = "parse_error"
+deterministic = true
+signing = "native"
+transport = "native"
+
+[operations.trade_parse_order_decision.implementation]
+rust_modules = ["crates/events_codec/src/trade/decode.rs"]
+rust_types = [
+ "radroots_events::RadrootsNostrEvent",
+ "radroots_events::trade::RadrootsActiveTradeEnvelope",
+ "radroots_events::trade::RadrootsTradeOrderDecisionEvent",
+]
+
+[operations.trade_parse_order_decision.conformance]
+vector = "spec/conformance/vectors/trade/parse_order_decision.v1.json"
+
[operations.trade_parse_listing_address]
domain = "trade"
id = "trade.parse_listing_address"
diff --git a/spec/sdk-exports/go.toml b/spec/sdk-exports/go.toml
@@ -19,7 +19,11 @@ order = 3
"listing.build_draft" = "listing.BuildDraft"
"listing.parse_event" = "listing.ParseEvent"
"trade.build_envelope_draft" = "trade.BuildEnvelopeDraft"
+"trade.build_order_request_draft" = "trade.BuildOrderRequestDraft"
+"trade.build_order_decision_draft" = "trade.BuildOrderDecisionDraft"
"trade.parse_envelope" = "trade.ParseEnvelope"
+"trade.parse_order_request" = "trade.ParseOrderRequest"
+"trade.parse_order_decision" = "trade.ParseOrderDecision"
"trade.parse_listing_address" = "trade.ParseListingAddress"
"trade.validate_listing_event" = "trade.ValidateListingEvent"
@@ -34,3 +38,10 @@ order = 3
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
"RadrootsTradeEnvelope" = "TradeEnvelope"
+"RadrootsActiveTradeEnvelope" = "ActiveTradeEnvelope"
+"RadrootsActiveTradeMessageType" = "ActiveTradeMessageType"
+"RadrootsTradeOrderItem" = "TradeOrderItem"
+"RadrootsTradeOrderRequested" = "TradeOrderRequested"
+"RadrootsTradeInventoryCommitment" = "TradeInventoryCommitment"
+"RadrootsTradeOrderDecision" = "TradeOrderDecision"
+"RadrootsTradeOrderDecisionEvent" = "TradeOrderDecisionEvent"
diff --git a/spec/sdk-exports/kotlin.toml b/spec/sdk-exports/kotlin.toml
@@ -19,7 +19,11 @@ order = 2
"listing.build_draft" = "listing.buildDraft"
"listing.parse_event" = "listing.parseEvent"
"trade.build_envelope_draft" = "trade.buildEnvelopeDraft"
+"trade.build_order_request_draft" = "trade.buildOrderRequestDraft"
+"trade.build_order_decision_draft" = "trade.buildOrderDecisionDraft"
"trade.parse_envelope" = "trade.parseEnvelope"
+"trade.parse_order_request" = "trade.parseOrderRequest"
+"trade.parse_order_decision" = "trade.parseOrderDecision"
"trade.parse_listing_address" = "trade.parseListingAddress"
"trade.validate_listing_event" = "trade.validateListingEvent"
@@ -34,3 +38,10 @@ order = 2
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
"RadrootsTradeEnvelope" = "TradeEnvelope"
+"RadrootsActiveTradeEnvelope" = "ActiveTradeEnvelope"
+"RadrootsActiveTradeMessageType" = "ActiveTradeMessageType"
+"RadrootsTradeOrderItem" = "TradeOrderItem"
+"RadrootsTradeOrderRequested" = "TradeOrderRequested"
+"RadrootsTradeInventoryCommitment" = "TradeInventoryCommitment"
+"RadrootsTradeOrderDecision" = "TradeOrderDecision"
+"RadrootsTradeOrderDecisionEvent" = "TradeOrderDecisionEvent"
diff --git a/spec/sdk-exports/py.toml b/spec/sdk-exports/py.toml
@@ -19,7 +19,11 @@ order = 3
"listing.build_draft" = "listing_build_draft"
"listing.parse_event" = "listing_parse_event"
"trade.build_envelope_draft" = "trade_build_envelope_draft"
+"trade.build_order_request_draft" = "trade_build_order_request_draft"
+"trade.build_order_decision_draft" = "trade_build_order_decision_draft"
"trade.parse_envelope" = "trade_parse_envelope"
+"trade.parse_order_request" = "trade_parse_order_request"
+"trade.parse_order_decision" = "trade_parse_order_decision"
"trade.parse_listing_address" = "trade_parse_listing_address"
"trade.validate_listing_event" = "trade_validate_listing_event"
@@ -34,3 +38,10 @@ order = 3
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
"RadrootsTradeEnvelope" = "TradeEnvelope"
+"RadrootsActiveTradeEnvelope" = "ActiveTradeEnvelope"
+"RadrootsActiveTradeMessageType" = "ActiveTradeMessageType"
+"RadrootsTradeOrderItem" = "TradeOrderItem"
+"RadrootsTradeOrderRequested" = "TradeOrderRequested"
+"RadrootsTradeInventoryCommitment" = "TradeInventoryCommitment"
+"RadrootsTradeOrderDecision" = "TradeOrderDecision"
+"RadrootsTradeOrderDecisionEvent" = "TradeOrderDecisionEvent"
diff --git a/spec/sdk-exports/swift.toml b/spec/sdk-exports/swift.toml
@@ -19,7 +19,11 @@ order = 2
"listing.build_draft" = "listing.buildDraft"
"listing.parse_event" = "listing.parseEvent"
"trade.build_envelope_draft" = "trade.buildEnvelopeDraft"
+"trade.build_order_request_draft" = "trade.buildOrderRequestDraft"
+"trade.build_order_decision_draft" = "trade.buildOrderDecisionDraft"
"trade.parse_envelope" = "trade.parseEnvelope"
+"trade.parse_order_request" = "trade.parseOrderRequest"
+"trade.parse_order_decision" = "trade.parseOrderDecision"
"trade.parse_listing_address" = "trade.parseListingAddress"
"trade.validate_listing_event" = "trade.validateListingEvent"
@@ -34,3 +38,10 @@ order = 2
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
"RadrootsTradeEnvelope" = "TradeEnvelope"
+"RadrootsActiveTradeEnvelope" = "ActiveTradeEnvelope"
+"RadrootsActiveTradeMessageType" = "ActiveTradeMessageType"
+"RadrootsTradeOrderItem" = "TradeOrderItem"
+"RadrootsTradeOrderRequested" = "TradeOrderRequested"
+"RadrootsTradeInventoryCommitment" = "TradeInventoryCommitment"
+"RadrootsTradeOrderDecision" = "TradeOrderDecision"
+"RadrootsTradeOrderDecisionEvent" = "TradeOrderDecisionEvent"
diff --git a/spec/sdk-exports/ts.toml b/spec/sdk-exports/ts.toml
@@ -20,7 +20,11 @@ order = 1
"listing.build_draft" = "listing.buildDraft"
"listing.parse_event" = "listing.parseEvent"
"trade.build_envelope_draft" = "trade.buildEnvelopeDraft"
+"trade.build_order_request_draft" = "trade.buildOrderRequestDraft"
+"trade.build_order_decision_draft" = "trade.buildOrderDecisionDraft"
"trade.parse_envelope" = "trade.parseEnvelope"
+"trade.parse_order_request" = "trade.parseOrderRequest"
+"trade.parse_order_decision" = "trade.parseOrderDecision"
"trade.parse_listing_address" = "trade.parseListingAddress"
"trade.validate_listing_event" = "trade.validateListingEvent"
@@ -35,6 +39,13 @@ order = 1
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
"RadrootsTradeEnvelope" = "TradeEnvelope"
+"RadrootsActiveTradeEnvelope" = "ActiveTradeEnvelope"
+"RadrootsActiveTradeMessageType" = "ActiveTradeMessageType"
+"RadrootsTradeOrderItem" = "TradeOrderItem"
+"RadrootsTradeOrderRequested" = "TradeOrderRequested"
+"RadrootsTradeInventoryCommitment" = "TradeInventoryCommitment"
+"RadrootsTradeOrderDecision" = "TradeOrderDecision"
+"RadrootsTradeOrderDecisionEvent" = "TradeOrderDecisionEvent"
[artifacts]
models_dir = "src/generated"