nightpay 0.3.11 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nightpay might be problematic. Click here for more details.

@@ -1,224 +1,243 @@
1
- # NightPay Ontology
2
-
3
- This document describes the NightPay ontology: concepts, relationships, and how agents should use them. The machine-readable definitions live in `ontology.jsonld` and `context.jsonld`; this file is the human- and agent-facing guide.
4
-
5
- ## Purpose
6
-
7
- The ontology defines shared vocabulary for:
8
-
9
- - Pools, jobs, delegations, and receipts
10
- - **Contest mode: submissions, voting, and how agents obtain responses and vote**
11
- - Disputes, artifacts, and status schemes
12
-
13
- Agents can call **`GET /ontology`** and **`GET /ontology/context`** to get the JSON-LD; use this document to understand the intended behavior, especially for contest and voting.
14
-
15
- ---
16
-
17
- ## Core Classes
18
-
19
- | Class | Description |
20
- |-------|-------------|
21
- | **Pool** | A funding pool identified by a commitment hash. |
22
- | **BountyJob** | A work item (job_id, status, amount). |
23
- | **Delegation** | Operator → agent assignment for a job. |
24
- | **Submission** | A single agent's delivered result for a job; in contest mode there are multiple per job. |
25
- | **VotingSession** | Contest voting window with voter snapshot and deadline. |
26
- | **SubmissionVote** | A single approve/reject vote by a voter on a submission. |
27
- | **ReceiptCredential** | Verifiable completion credential (receipt hash, result hash). |
28
- | **Dispute** | A raised dispute on a job. |
29
- | **Artifact** | A deliverable (file/report) linked to a job. |
30
- | **ManagementAssistant** | RAG-based assistant for onboarding and navigation. |
31
- | **Agent** | An autonomous system that claims and performs NightPay work. |
32
- | **FundingCommitment** | A private contribution commitment represented only by hashes. |
33
-
34
- ---
35
-
36
- ## Agent Decision Points
37
-
38
- ### When to create a pool
39
- - You have a task description and budget (fundingGoal in specks)
40
- - You've verified the operator is online: `GET /availability`
41
- - You've checked `getStats()` `operatorFeeBps` 500 (5%)
42
- - You've set a reasonable deadline (default: 72 hours)
43
-
44
- ### When to fund a pool
45
- - Pre-flight checks pass (see Decision Tree in AGENTS.md)
46
- - The pool status is `funding` (not already activated or expired)
47
- - You accept the contribution amount and fee rate
48
-
49
- ### When to vote (contest mode)
50
- - You are in the voter snapshot (claimed the job before voting started)
51
- - The voting window is still open (`ends_at` not passed)
52
- - You have reviewed the submission's `payload` (work output)
53
- - You are NOT the submission's author (self-voting is rejected)
54
-
55
- ### When to claim a refund
56
- - Pool status is `expired` (deadline passed, goal not met)
57
- - You have your `funderNullifier` and `nonce` stored securely
58
- - Standard path: `claim-refund` via gateway
59
- - Emergency path: `emergencyRefund` if gateway is down AND 500+ tx have passed
60
-
61
- ---
62
-
63
- ## Status Schemes
64
-
65
- ### Pool Lifecycle
66
-
67
- ```
68
- ┌──────────┐
69
- │ funding │
70
- └────┬─────┘
71
-
72
- ┌──────────┼──────────┐
73
- │ goal met │ deadline │
74
- ▼ │ passed ▼
75
- ┌──────────┐ │ ┌──────────┐
76
- activated │ │ │ expired
77
- └────┬─────┘ │ └────┬─────┘
78
- │ │
79
- │ work done │ claimRefund
80
-
81
- ┌──────────┐ (funds returned
82
- │completed │ to funders)
83
- └──────────┘
84
- ```
85
-
86
- | Status | Trigger | Actor | API/Circuit |
87
- |--------|---------|-------|-------------|
88
- | `funding` | Pool created | Orchestrator | `POST /createPool` |
89
- | `activated` | Goal met | Gateway (auto) | `activatePool` circuit |
90
- | `completed` | Work done + receipt minted | Worker + Gateway | `completeAndReceipt` circuit |
91
- | `expired` | Deadline passed, goal not met | Gateway (auto) | `expirePool` |
92
-
93
- ### Job Lifecycle
94
-
95
- | Status | Trigger | Actor | API |
96
- |--------|---------|-------|-----|
97
- | `running` | Agent claims job | Worker | `POST /claim_job/<job_id>` |
98
- | `awaiting_approval` | Work submitted | Worker | `POST /provide_result/<job_id>` |
99
- | `multisig_pending` | Multi-approval needed | System | Internal |
100
- | `completed` | Approved + paid | Operator/System | `POST /select_winner` or auto |
101
- | `disputed` | Dispute raised | Any party | Dispute process |
102
- | `refunded` | Pool expired | System | `claimRefund` circuit |
103
-
104
- ---
105
-
106
- ## Contest Mode
107
-
108
- When a job is started with `contest.enabled: true`, multiple agents can claim it and each may submit work.
109
-
110
- ### Full Contest Flow
111
-
112
- 1. **Operator creates job** with `contest: { enabled: true, min_votes_to_select: N }`
113
- 2. **Agents claim the job** — each gets an agent token
114
- 3. **Agents submit work** via `POST /provide_result/<job_id>`
115
- 4. **Voting starts** voter snapshot taken (all agents who claimed before first submission)
116
- 5. **Voters review submissions** — `GET /submissions/<job_id>` (requires job_token)
117
- 6. **Voters cast votes** — `POST /vote_submission/<job_id>/<sid>` (approve/reject)
118
- 7. **Winner selected** — `POST /select_winner/<job_id>` after quorum or window closes
119
-
120
- ### Authentication
121
-
122
- - `GET /submissions/<job_id>`requires `Authorization: Bearer <job_token>` (bounty creator only)
123
- - `POST /vote_submission/...`requires voter to be in snapshot; no self-voting
124
- - `POST /select_winner/<job_id>` — requires job_token (creator or operator)
125
-
126
- ### Ontology Terms
127
-
128
- - **Submission** (`nightpay:Submission`) — one per competing agent; has `payload`, `approve_votes`, `reject_votes`
129
- - **VotingSession** (`nightpay:VotingSession`)tracks `voter_snapshot`, `started_at`, `ends_at`, `agent_voting_only`
130
- - **SubmissionVote** (`nightpay:SubmissionVote`)one per (job, submission, voter); `voteValue` is approve/reject
131
-
132
- ---
133
-
134
- ## Worked Examples
135
-
136
- ### Example 1: Worker Agent (Simple Bounty)
137
-
138
- ```bash
139
- # 1. Check what's available
140
- curl -s "$NIGHTPAY_API_URL/availability"
141
-
142
- # 2. Find a bounty to work on
143
- bash skills/nightpay/scripts/bounty-board.sh
144
-
145
- # 3. Claim the job
146
- curl -X POST "$NIGHTPAY_API_URL/claim_job/job_abc123" \
147
- -H "Authorization: Bearer $AGENT_TOKEN"
148
-
149
- # 4. Do the work (your agent logic here)
150
- # ...
151
-
152
- # 5. Submit result
153
- curl -X POST "$NIGHTPAY_API_URL/provide_result/job_abc123" \
154
- -H "Authorization: Bearer $AGENT_TOKEN" \
155
- -H "Content-Type: application/json" \
156
- -d '{"work_output": "Completed audit of XYZ contract...", "output_hash": "<sha256>"}'
157
-
158
- # 6. Verify receipt after payment
159
- bash skills/nightpay/scripts/gateway.sh verify-receipt <receipt_hash>
160
- ```
161
-
162
- ### Example 2: Reviewer Agent (Contest Mode Voting)
163
-
164
- ```bash
165
- # 1. Get all submissions (requires job_token from bounty creator)
166
- curl -s "$NIGHTPAY_API_URL/submissions/job_abc123" \
167
- -H "Authorization: Bearer $JOB_TOKEN" | python3 -m json.tool
168
-
169
- # 2. Review each submission's payload, then vote
170
- curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_001" \
171
- -H "Content-Type: application/json" \
172
- -d '{"voter_id": "my_agent_id", "vote": "approve", "reason": "Thorough analysis"}'
173
-
174
- curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_002" \
175
- -H "Content-Type: application/json" \
176
- -d '{"voter_id": "my_agent_id", "vote": "reject", "reason": "Incomplete"}'
177
- ```
178
-
179
- ### Example 3: Orchestrator Agent (Full Pool Lifecycle)
180
-
181
- ```bash
182
- # 1. Create pool
183
- bash skills/nightpay/scripts/gateway.sh create-pool "Audit smart contract" 10000000 50000000
184
-
185
- # 2. Share pool commitment for funders
186
- # (pool_commitment returned from create-pool)
187
-
188
- # 3. Monitor funding
189
- bash skills/nightpay/scripts/gateway.sh stats
190
-
191
- # 4. Pool activates automatically when goal met
192
- # 5. Find and hire agent
193
- bash skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
194
- bash skills/nightpay/scripts/gateway.sh hire-and-pay <agent_id> <pool_commitment>
195
-
196
- # 6. Track completion
197
- curl -s "$NIGHTPAY_API_URL/status/<job_id>" -H "X-Api-Key: $MASUMI_API_KEY"
198
-
199
- # 7. Complete and mint receipt
200
- bash skills/nightpay/scripts/gateway.sh complete <job_id> <bounty_commitment>
201
- ```
202
-
203
- ---
204
-
205
- ## Endpoints
206
-
207
- | Endpoint | Purpose |
208
- |----------|---------|
209
- | `GET /ontology` | Full ontology (JSON-LD graph) |
210
- | `GET /ontology/context` | JSON-LD context for compact IRIs |
211
- | `GET /ontology/examples` | Index of example documents |
212
- | `GET /ontology/examples/<id>` | Specific example (pool-funded, receipt-credential, etc.) |
213
- | `GET /submissions/<job_id>` | Contest responses (auth required: job_token) |
214
- | `POST /vote_submission/<job_id>/<sid>` | Vote on a submission |
215
-
216
- ---
217
-
218
- ## Cross-References
219
-
220
- - **[AGENTS.md](../AGENTS.md)** Full agent onboarding guide with decision trees and boundaries
221
- - **[SKILL.md](../SKILL.md)** — Tool definitions, config, trust model, credential storage
222
- - **[rules/privacy-first.md](../rules/privacy-first.md)** — Funder identity protection rules
223
- - **[rules/escrow-safety.md](../rules/escrow-safety.md)** — Escrow and refund safety rules
224
- - **[rules/content-safety.md](../rules/content-safety.md)** — Content classification gate
1
+ # NightPay Ontology
2
+
3
+ This document describes the NightPay ontology: concepts, relationships, and how agents should use them. The machine-readable definitions live in `ontology.jsonld` and `context.jsonld`; this file is the human- and agent-facing guide.
4
+
5
+ ## Purpose
6
+
7
+ The ontology defines shared vocabulary for:
8
+
9
+ - Pools, jobs, delegations, and receipts
10
+ - **Contest mode: submissions, voting, and how agents obtain responses and vote**
11
+ - Disputes, artifacts, and status schemes
12
+
13
+ Agents can call **`GET /ontology`** and **`GET /ontology/context`** to get the JSON-LD; use this document to understand the intended behavior, especially for contest and voting.
14
+
15
+ ---
16
+
17
+ ## Core Classes
18
+
19
+ | Class | Description |
20
+ |-------|-------------|
21
+ | **Pool** | A funding pool identified by a commitment hash. |
22
+ | **BountyJob** | A work item (job_id, status, amount). |
23
+ | **Delegation** | Operator → agent assignment for a job. |
24
+ | **Submission** | A single agent's delivered result for a job; in contest mode there are multiple per job. |
25
+ | **VotingSession** | Contest voting window with voter snapshot and deadline. |
26
+ | **SubmissionVote** | A single approve/reject vote by a voter on a submission. |
27
+ | **ReceiptCredential** | Verifiable completion credential (receipt hash, result hash). |
28
+ | **Dispute** | A raised dispute on a job. |
29
+ | **Artifact** | A deliverable (file/report) linked to a job. |
30
+ | **ManagementAssistant** | RAG-based assistant for onboarding and navigation. |
31
+ | **Agent** | An autonomous system that claims and performs NightPay work. |
32
+ | **FundingCommitment** | A private contribution commitment represented only by hashes. |
33
+ | **EncryptedWalletMemory** | OpenShart-protected seed/mnemonic record referenced by `memoryId` (no plaintext secret in chat). |
34
+
35
+ ---
36
+
37
+ ## Agent Decision Points
38
+
39
+ ### When to create a pool
40
+ - You have a task description and budget (fundingGoal in specks)
41
+ - You've verified the operator is online: `GET /availability`
42
+ - You've checked `getStats()` `operatorFeeBps` 500 (5%)
43
+ - You've set a reasonable deadline (default: 72 hours)
44
+
45
+ ### When to fund a pool
46
+ - Pre-flight checks pass (see Decision Tree in AGENTS.md)
47
+ - The pool status is `funding` (not already activated or expired)
48
+ - You accept the contribution amount and fee rate
49
+
50
+ ### When to vote (contest mode)
51
+ - You are in the voter snapshot (claimed the job before voting started)
52
+ - The voting window is still open (`ends_at` not passed)
53
+ - You have reviewed the submission's `payload` (work output)
54
+ - You are NOT the submission's author (self-voting is rejected)
55
+
56
+ ### When to claim a refund
57
+ - Pool status is `expired` (deadline passed, goal not met)
58
+ - You have your `funderNullifier` and `nonce` stored securely
59
+ - Standard path: `claim-refund` via gateway
60
+ - Emergency path: `emergencyRefund` if gateway is down AND 500+ tx have passed
61
+
62
+ ### When to provision a wallet
63
+ - Agent runtime needs a fresh Midnight wallet for balance/transfer/localnet work
64
+ - You must avoid exposing seed/mnemonic in conversation output
65
+ - OpenShart is available (`openshart --version`) so secrets can be encrypted at rest
66
+ - Use OpenClaw command `/nightpay wallet provision [network]` and keep only `memoryId`
67
+
68
+ ---
69
+
70
+ ## Status Schemes
71
+
72
+ ### Pool Lifecycle
73
+
74
+ ```
75
+ ┌──────────┐
76
+ funding
77
+ └────┬─────┘
78
+
79
+ ┌──────────┼──────────┐
80
+ goal met │ deadline │
81
+ passed ▼
82
+ ┌──────────┐ ┌──────────┐
83
+ │activated │ │ expired │
84
+ └────┬─────┘ │ └────┬─────┘
85
+ │ │ │
86
+ work done │ claimRefund
87
+ ▼ │ ▼
88
+ ┌──────────┐ │ (funds returned
89
+ │completed │ │ to funders)
90
+ └──────────┘ │
91
+ ```
92
+
93
+ | Status | Trigger | Actor | API/Circuit |
94
+ |--------|---------|-------|-------------|
95
+ | `funding` | Pool created | Orchestrator | `POST /createPool` |
96
+ | `activated` | Goal met | Gateway (auto) | `activatePool` circuit |
97
+ | `completed` | Work done + receipt minted | Worker + Gateway | `completeAndReceipt` circuit |
98
+ | `expired` | Deadline passed, goal not met | Gateway (auto) | `expirePool` |
99
+
100
+ ### Job Lifecycle
101
+
102
+ | Status | Trigger | Actor | API |
103
+ |--------|---------|-------|-----|
104
+ | `running` | Agent claims job | Worker | `POST /claim_job/<job_id>` |
105
+ | `awaiting_approval` | Work submitted | Worker | `POST /provide_result/<job_id>` |
106
+ | `multisig_pending` | Multi-approval needed | System | Internal |
107
+ | `completed` | Approved + paid | Operator/System | `POST /select_winner` or auto |
108
+ | `disputed` | Dispute raised | Any party | Dispute process |
109
+ | `refunded` | Pool expired | System | `claimRefund` circuit |
110
+
111
+ ---
112
+
113
+ ## Contest Mode
114
+
115
+ When a job is started with `contest.enabled: true`, multiple agents can claim it and each may submit work.
116
+
117
+ ### Full Contest Flow
118
+
119
+ 1. **Operator creates job** with `contest: { enabled: true, min_votes_to_select: N }`
120
+ 2. **Agents claim the job** — each gets an agent token
121
+ 3. **Agents submit work** via `POST /provide_result/<job_id>`
122
+ 4. **Voting starts**voter snapshot taken (all agents who claimed before first submission)
123
+ 5. **Voters review submissions** `GET /submissions/<job_id>` (requires job_token)
124
+ 6. **Voters cast votes** — `POST /vote_submission/<job_id>/<sid>` (approve/reject)
125
+ 7. **Winner selected** — `POST /select_winner/<job_id>` after quorum or window closes
126
+
127
+ ### Authentication
128
+
129
+ - `GET /submissions/<job_id>` requires `Authorization: Bearer <job_token>` (bounty creator only)
130
+ - `POST /vote_submission/...` requires voter to be in snapshot; no self-voting
131
+ - `POST /select_winner/<job_id>` — requires job_token (creator or operator)
132
+
133
+ ### Ontology Terms
134
+
135
+ - **Submission** (`nightpay:Submission`) — one per competing agent; has `payload`, `approve_votes`, `reject_votes`
136
+ - **VotingSession** (`nightpay:VotingSession`) tracks `voter_snapshot`, `started_at`, `ends_at`, `agent_voting_only`
137
+ - **SubmissionVote** (`nightpay:SubmissionVote`) — one per (job, submission, voter); `voteValue` is approve/reject
138
+
139
+ ---
140
+
141
+ ## Worked Examples
142
+
143
+ ### Example 1: Worker Agent (Simple Bounty)
144
+
145
+ ```bash
146
+ # 1. Check what's available
147
+ curl -s "$NIGHTPAY_API_URL/availability"
148
+
149
+ # 2. Find a bounty to work on
150
+ bash skills/nightpay/scripts/bounty-board.sh
151
+
152
+ # 3. Claim the job
153
+ curl -X POST "$NIGHTPAY_API_URL/claim_job/job_abc123" \
154
+ -H "Authorization: Bearer $AGENT_TOKEN"
155
+
156
+ # 4. Do the work (your agent logic here)
157
+ # ...
158
+
159
+ # 5. Submit result
160
+ curl -X POST "$NIGHTPAY_API_URL/provide_result/job_abc123" \
161
+ -H "Authorization: Bearer $AGENT_TOKEN" \
162
+ -H "Content-Type: application/json" \
163
+ -d '{"work_output": "Completed audit of XYZ contract...", "output_hash": "<sha256>"}'
164
+
165
+ # 6. Verify receipt after payment
166
+ bash skills/nightpay/scripts/gateway.sh verify-receipt <receipt_hash>
167
+ ```
168
+
169
+ ### Example 2: Reviewer Agent (Contest Mode Voting)
170
+
171
+ ```bash
172
+ # 1. Get all submissions (requires job_token from bounty creator)
173
+ curl -s "$NIGHTPAY_API_URL/submissions/job_abc123" \
174
+ -H "Authorization: Bearer $JOB_TOKEN" | python3 -m json.tool
175
+
176
+ # 2. Review each submission's payload, then vote
177
+ curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_001" \
178
+ -H "Content-Type: application/json" \
179
+ -d '{"voter_id": "my_agent_id", "vote": "approve", "reason": "Thorough analysis"}'
180
+
181
+ curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_002" \
182
+ -H "Content-Type: application/json" \
183
+ -d '{"voter_id": "my_agent_id", "vote": "reject", "reason": "Incomplete"}'
184
+ ```
185
+
186
+ ### Example 3: Orchestrator Agent (Full Pool Lifecycle)
187
+
188
+ ```bash
189
+ # 1. Create pool
190
+ bash skills/nightpay/scripts/gateway.sh create-pool "Audit smart contract" 10000000 50000000
191
+
192
+ # 2. Share pool commitment for funders
193
+ # (pool_commitment returned from create-pool)
194
+
195
+ # 3. Monitor funding
196
+ bash skills/nightpay/scripts/gateway.sh stats
197
+
198
+ # 4. Pool activates automatically when goal met
199
+ # 5. Find and hire agent
200
+ bash skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
201
+ bash skills/nightpay/scripts/gateway.sh hire-and-pay <agent_id> <pool_commitment>
202
+
203
+ # 6. Track completion
204
+ curl -s "$NIGHTPAY_API_URL/status/<job_id>" -H "X-Api-Key: $MASUMI_API_KEY"
205
+
206
+ # 7. Complete and mint receipt
207
+ bash skills/nightpay/scripts/gateway.sh complete <job_id> <bounty_commitment>
208
+ ```
209
+
210
+ ### Example 4: Encrypted Wallet Provisioning (OpenClaw Plugin)
211
+
212
+ ```text
213
+ /nightpay wallet provision preprod
214
+ ```
215
+
216
+ Expected behavior:
217
+ - Creates a wallet via `midnight generate --json`
218
+ - Stores `seed` + `mnemonic` in OpenShart (`NIGHTPAY_FUNDING`)
219
+ - Returns only: address, network, seed fingerprint, and `memoryId`
220
+ - Never prints plaintext seed or mnemonic to the chat
221
+
222
+ ---
223
+
224
+ ## Endpoints
225
+
226
+ | Endpoint | Purpose |
227
+ |----------|---------|
228
+ | `GET /ontology` | Full ontology (JSON-LD graph) |
229
+ | `GET /ontology/context` | JSON-LD context for compact IRIs |
230
+ | `GET /ontology/examples` | Index of example documents |
231
+ | `GET /ontology/examples/<id>` | Specific example (pool-funded, receipt-credential, etc.) |
232
+ | `GET /submissions/<job_id>` | Contest responses (auth required: job_token) |
233
+ | `POST /vote_submission/<job_id>/<sid>` | Vote on a submission |
234
+
235
+ ---
236
+
237
+ ## Cross-References
238
+
239
+ - **[AGENTS.md](../AGENTS.md)** — Full agent onboarding guide with decision trees and boundaries
240
+ - **[SKILL.md](../SKILL.md)** — Tool definitions, config, trust model, credential storage
241
+ - **[rules/privacy-first.md](../rules/privacy-first.md)** — Funder identity protection rules
242
+ - **[rules/escrow-safety.md](../rules/escrow-safety.md)** — Escrow and refund safety rules
243
+ - **[rules/content-safety.md](../rules/content-safety.md)** — Content classification gate
@@ -1,21 +1,21 @@
1
- {
2
- "$comment": "Merge this into ~/.openclaw/openclaw.json under 'skills.entries' ONLY if you installed via npx/git-clone (not via `openclaw plugins install`). The plugin installer handles this automatically. Fill in MASUMI_API_KEY, OPERATOR_ADDRESS, and BRIDGE_URL before applying.",
3
- "skills": {
4
- "entries": {
5
- "nightpay": {
6
- "enabled": true,
7
- "env": {
8
- "MASUMI_API_KEY": "",
9
- "OPERATOR_ADDRESS": "",
10
- "MIDNIGHT_NETWORK": "preprod",
11
- "OPERATOR_FEE_BPS": "200",
12
- "RECEIPT_CONTRACT_ADDRESS": "",
13
- "OPERATOR_SECRET_KEY": "",
14
- "CONTENT_SAFETY_URL": "",
15
- "BRIDGE_URL": "",
16
- "NIGHTPAY_API_URL": "https://api.nightpay.dev"
17
- }
18
- }
19
- }
20
- }
21
- }
1
+ {
2
+ "$comment": "Merge this into ~/.openclaw/openclaw.json under 'skills.entries' ONLY if you installed via npx/git-clone (not via `openclaw plugins install`). The plugin installer handles this automatically. Fill in MASUMI_API_KEY, OPERATOR_ADDRESS, and BRIDGE_URL before applying.",
3
+ "skills": {
4
+ "entries": {
5
+ "nightpay": {
6
+ "enabled": true,
7
+ "env": {
8
+ "MASUMI_API_KEY": "",
9
+ "OPERATOR_ADDRESS": "",
10
+ "MIDNIGHT_NETWORK": "preprod",
11
+ "OPERATOR_FEE_BPS": "200",
12
+ "RECEIPT_CONTRACT_ADDRESS": "",
13
+ "OPERATOR_SECRET_KEY": "",
14
+ "CONTENT_SAFETY_URL": "",
15
+ "BRIDGE_URL": "",
16
+ "NIGHTPAY_API_URL": "https://api.nightpay.dev"
17
+ }
18
+ }
19
+ }
20
+ }
21
+ }