openvibers/openvibe.contracts Commits
v0.30.1: cashout events carry the payout method's type only, never its address
Changes
@@@ -4,6 +4,12 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.30.1 — 2026-09-23++++- `billing.cashout.requested|paid|denied`: `cashout.payout_method` carries the method's `type` only++ (`additionalProperties: false`). The address (e.g. a PayPal email) stays in Billing and never++ travels on the retained event stream. No producer had emitted a cashout event yet.++## 0.30.0 (2026-09-23)Additive: `compat.js` reports no breaking change against v0.29.0. No existing contract changed.@@@ -17,7 +17,7 @@"amount_bits": { "type": "integer", "minimum": 1 },"value_cents": { "type": "integer" },"status": { "const": "denied" },-- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },++ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },"escrow_until": { "type": "string" },"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },@@@ -17,7 +17,7 @@"amount_bits": { "type": "integer", "minimum": 1 },"value_cents": { "type": "integer" },"status": { "const": "paid" },-- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },++ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },"escrow_until": { "type": "string" },"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },@@@ -17,7 +17,7 @@"amount_bits": { "type": "integer", "minimum": 1 },"value_cents": { "type": "integer" },"status": { "const": "requested" },-- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },++ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },"escrow_until": { "type": "string" },"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "denied","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "denied","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "paid","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "paid","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",nnew file mode 100644@@@ -0,0 +1,25 @@++{++ "cashout": {++ "id": "co_01JAB3C4D5E6F7G8H9J0K1MNQ5",++ "subject": {++ "type": "user",++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"++ },++ "amount_bits": 5000,++ "value_cents": 5000,++ "status": "requested",++ "payout_method": {++ "type": "paypal",++ "address": "[email protected]"++ },++ "escrow_until": "2026-09-30T10:00:00.000Z",++ "request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",++ "settle_txn": null,++ "payout_provider": null,++ "payout_reference": null,++ "reason": null,++ "created_at": "2026-09-23T10:00:00.000Z",++ "updated_at": "2026-09-23T10:00:00.000Z"++ },++ "transaction_id": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6"++}@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "paid","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",@@@ -9,8 +9,7 @@"value_cents": 5000,"status": "requested","payout_method": {-- "type": "paypal",-- "address": "[email protected]"++ "type": "paypal"},"escrow_until": "2026-09-30T10:00:00.000Z","request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",@@@ -6185,7 +6185,19 @@},"payout_method": {"type": "object",-- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."++ "required": [++ "type"++ ],++ "additionalProperties": false,++ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",++ "properties": {++ "type": {++ "type": [++ "string",++ "null"++ ]++ }++ }},"escrow_until": {"type": "string"@@@ -6290,7 +6302,19 @@},"payout_method": {"type": "object",-- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."++ "required": [++ "type"++ ],++ "additionalProperties": false,++ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",++ "properties": {++ "type": {++ "type": [++ "string",++ "null"++ ]++ }++ }},"escrow_until": {"type": "string"@@@ -6395,7 +6419,19 @@},"payout_method": {"type": "object",-- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."++ "required": [++ "type"++ ],++ "additionalProperties": false,++ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",++ "properties": {++ "type": {++ "type": [++ "string",++ "null"++ ]++ }++ }},"escrow_until": {"type": "string"@@@ -6151,9 +6151,11 @@ export interface BillingCashoutRequestedPayload {value_cents: number;status: "requested";/**-- * { type, address } as the creator entered it (e.g. a PayPal email).++ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.*/-- payout_method: {};++ payout_method: {++ type: string | null;++ };escrow_until: string;request_txn: string;settle_txn: string | null;@@@ -6181,9 +6183,11 @@ export interface BillingCashoutPaidPayload {value_cents: number;status: "paid";/**-- * { type, address } as the creator entered it (e.g. a PayPal email).++ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.*/-- payout_method: {};++ payout_method: {++ type: string | null;++ };escrow_until: string;request_txn: string;settle_txn: string | null;@@@ -6211,9 +6215,11 @@ export interface BillingCashoutDeniedPayload {value_cents: number;status: "denied";/**-- * { type, address } as the creator entered it (e.g. a PayPal email).++ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.*/-- payout_method: {};++ payout_method: {++ type: string | null;++ };escrow_until: string;request_txn: string;settle_txn: string | null;@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.30.0",++ "version": "0.30.1","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.30.0",++ "version": "0.30.1","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.30.0",++ "version": "0.30.1","description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.","main": "index.js","types": "generated/typescript/index.d.ts",
@@ -4,6 +4,12 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,12 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.30.1 — 2026-09-23
+
+- `billing.cashout.requested|paid|denied`: `cashout.payout_method` carries the method's `type` only
+ (`additionalProperties: false`). The address (e.g. a PayPal email) stays in Billing and never
+ travels on the retained event stream. No producer had emitted a cashout event yet.
+
## 0.30.0 (2026-09-23)
## 0.30.0 (2026-09-23)
Additive: `compat.js` reports no breaking change against v0.29.0. No existing contract changed.
Additive: `compat.js` reports no breaking change against v0.29.0. No existing contract changed.
@@ -17,7 +17,7 @@
@@ -17,7 +17,7 @@
"amount_bits": { "type": "integer", "minimum": 1 },
"amount_bits": { "type": "integer", "minimum": 1 },
"value_cents": { "type": "integer" },
"value_cents": { "type": "integer" },
"status": { "const": "denied" },
"status": { "const": "denied" },
- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },
+ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },
"escrow_until": { "type": "string" },
"escrow_until": { "type": "string" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
@@ -17,7 +17,7 @@
@@ -17,7 +17,7 @@
"amount_bits": { "type": "integer", "minimum": 1 },
"amount_bits": { "type": "integer", "minimum": 1 },
"value_cents": { "type": "integer" },
"value_cents": { "type": "integer" },
"status": { "const": "paid" },
"status": { "const": "paid" },
- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },
+ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },
"escrow_until": { "type": "string" },
"escrow_until": { "type": "string" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
@@ -17,7 +17,7 @@
@@ -17,7 +17,7 @@
"amount_bits": { "type": "integer", "minimum": 1 },
"amount_bits": { "type": "integer", "minimum": 1 },
"value_cents": { "type": "integer" },
"value_cents": { "type": "integer" },
"status": { "const": "requested" },
"status": { "const": "requested" },
- "payout_method": { "type": "object", "description": "{ type, address } as the creator entered it (e.g. a PayPal email)." },
+ "payout_method": { "type": "object", "required": ["type"], "additionalProperties": false, "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.", "properties": { "type": { "type": ["string", "null"] } } },
"escrow_until": { "type": "string" },
"escrow_until": { "type": "string" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"request_txn": { "type": "string", "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
"settle_txn": { "type": ["string", "null"], "pattern": "^txn_[0-9A-HJKMNP-TV-Z]{26}$" },
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "denied",
"status": "denied",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "denied",
"status": "denied",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "paid",
"status": "paid",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "paid",
"status": "paid",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
+{
+ "cashout": {
+ "id": "co_01JAB3C4D5E6F7G8H9J0K1MNQ5",
+ "subject": {
+ "type": "user",
+ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
+ },
+ "amount_bits": 5000,
+ "value_cents": 5000,
+ "status": "requested",
+ "payout_method": {
+ "type": "paypal",
+ "address": "[email protected]"
+ },
+ "escrow_until": "2026-09-30T10:00:00.000Z",
+ "request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
+ "settle_txn": null,
+ "payout_provider": null,
+ "payout_reference": null,
+ "reason": null,
+ "created_at": "2026-09-23T10:00:00.000Z",
+ "updated_at": "2026-09-23T10:00:00.000Z"
+ },
+ "transaction_id": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6"
+}
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "paid",
"status": "paid",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
@@ -9,8 +9,7 @@
@@ -9,8 +9,7 @@
"value_cents": 5000,
"value_cents": 5000,
"status": "requested",
"status": "requested",
"payout_method": {
"payout_method": {
- "type": "paypal",
- "address": "[email protected]"
+ "type": "paypal"
},
},
"escrow_until": "2026-09-30T10:00:00.000Z",
"escrow_until": "2026-09-30T10:00:00.000Z",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
"request_txn": "txn_01JAB3C4D5E6F7G8H9J0K1MNQ6",
@@ -6185,7 +6185,19 @@
@@ -6185,7 +6185,19 @@
},
},
"payout_method": {
"payout_method": {
"type": "object",
"type": "object",
- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."
+ "required": [
+ "type"
+ ],
+ "additionalProperties": false,
+ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",
+ "properties": {
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
},
},
"escrow_until": {
"escrow_until": {
"type": "string"
"type": "string"
@@ -6290,7 +6302,19 @@
@@ -6290,7 +6302,19 @@
},
},
"payout_method": {
"payout_method": {
"type": "object",
"type": "object",
- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."
+ "required": [
+ "type"
+ ],
+ "additionalProperties": false,
+ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",
+ "properties": {
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
},
},
"escrow_until": {
"escrow_until": {
"type": "string"
"type": "string"
@@ -6395,7 +6419,19 @@
@@ -6395,7 +6419,19 @@
},
},
"payout_method": {
"payout_method": {
"type": "object",
"type": "object",
- "description": "{ type, address } as the creator entered it (e.g. a PayPal email)."
+ "required": [
+ "type"
+ ],
+ "additionalProperties": false,
+ "description": "The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.",
+ "properties": {
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
},
},
"escrow_until": {
"escrow_until": {
"type": "string"
"type": "string"
@@ -6151,9 +6151,11 @@ export interface BillingCashoutRequestedPayload {
@@ -6151,9 +6151,11 @@ export interface BillingCashoutRequestedPayload {
value_cents: number;
value_cents: number;
status: "requested";
status: "requested";
/**
/**
- * { type, address } as the creator entered it (e.g. a PayPal email).
+ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.
*/
*/
- payout_method: {};
+ payout_method: {
+ type: string | null;
+ };
escrow_until: string;
escrow_until: string;
request_txn: string;
request_txn: string;
settle_txn: string | null;
settle_txn: string | null;
@@ -6181,9 +6183,11 @@ export interface BillingCashoutPaidPayload {
@@ -6181,9 +6183,11 @@ export interface BillingCashoutPaidPayload {
value_cents: number;
value_cents: number;
status: "paid";
status: "paid";
/**
/**
- * { type, address } as the creator entered it (e.g. a PayPal email).
+ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.
*/
*/
- payout_method: {};
+ payout_method: {
+ type: string | null;
+ };
escrow_until: string;
escrow_until: string;
request_txn: string;
request_txn: string;
settle_txn: string | null;
settle_txn: string | null;
@@ -6211,9 +6215,11 @@ export interface BillingCashoutDeniedPayload {
@@ -6211,9 +6215,11 @@ export interface BillingCashoutDeniedPayload {
value_cents: number;
value_cents: number;
status: "denied";
status: "denied";
/**
/**
- * { type, address } as the creator entered it (e.g. a PayPal email).
+ * The payout method's kind only; the address (e.g. a PayPal email) stays in Billing and never travels on the event stream.
*/
*/
- payout_method: {};
+ payout_method: {
+ type: string | null;
+ };
escrow_until: string;
escrow_until: string;
request_txn: string;
request_txn: string;
settle_txn: string | null;
settle_txn: string | null;
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.30.0",
+ "version": "0.30.1",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.30.0",
+ "version": "0.30.1",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.30.0",
+ "version": "0.30.1",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",