@mnemopay/sdk 0.7.5 → 0.8.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paystack.d.ts","sourceRoot":"","sources":["../../src/rails/paystack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ /**
3
+ * Paystack Payment Rail for MnemoPay
4
+ *
5
+ * Production-grade integration with Paystack's payment infrastructure.
6
+ * Supports NGN, GHS, ZAR, KES, USD. Uses the same battle-tested patterns
7
+ * from the Dele backend: idempotency guards, webhook HMAC-SHA512 verification,
8
+ * failure reversals, and reference-based deduplication.
9
+ *
10
+ * Usage:
11
+ * const rail = new PaystackRail("sk_live_...", { currency: "NGN" });
12
+ * const agent = MnemoPay.quick("agent-1", { paymentRail: rail });
13
+ *
14
+ * Flows:
15
+ * 1. Checkout: createHold → user pays at authorization_url → capturePayment (verify)
16
+ * 2. Saved card: createHold with authorizationCode → auto-charged → capturePayment (verify)
17
+ * 3. Payout: createTransferRecipient → initiateTransfer
18
+ * 4. Webhook: verifyWebhook → process event
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.NIGERIAN_BANKS = exports.PaystackRail = void 0;
22
+ const crypto_1 = require("crypto");
23
+ // ─── Paystack Rail ─────────────────────────────────────────────────────────
24
+ class PaystackRail {
25
+ name = "paystack";
26
+ secretKey;
27
+ currency;
28
+ baseUrl;
29
+ callbackUrl;
30
+ timeoutMs;
31
+ channels;
32
+ /** Reference-based idempotency guard — tracks processed references */
33
+ processedRefs = new Set();
34
+ constructor(secretKey, config) {
35
+ if (!secretKey || typeof secretKey !== "string") {
36
+ throw new Error("Paystack secret key is required");
37
+ }
38
+ if (!secretKey.startsWith("sk_")) {
39
+ throw new Error("Invalid Paystack secret key format (must start with sk_)");
40
+ }
41
+ this.secretKey = secretKey;
42
+ this.currency = config?.currency ?? "NGN";
43
+ this.baseUrl = (config?.baseUrl ?? "https://api.paystack.co").replace(/\/$/, "");
44
+ this.callbackUrl = config?.callbackUrl;
45
+ this.timeoutMs = config?.timeoutMs ?? 30_000;
46
+ this.channels = config?.channels;
47
+ }
48
+ // ── PaymentRail Interface ───────────────────────────────────────────────
49
+ /**
50
+ * Initialize a Paystack transaction (hold).
51
+ *
52
+ * If no authorizationCode is in metadata, returns an authorization_url
53
+ * for checkout. If authorizationCode is present, charges the saved card
54
+ * directly (no redirect needed).
55
+ */
56
+ async createHold(amount, reason, agentId, options) {
57
+ if (!Number.isFinite(amount) || amount <= 0) {
58
+ throw new Error("Amount must be a positive finite number");
59
+ }
60
+ const reference = `mnemo_${agentId}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
61
+ const amountInMinor = this.toMinorUnits(amount);
62
+ const email = options?.email ?? `${agentId}@mnemopay.agent`;
63
+ if (options?.authorizationCode) {
64
+ // Charge saved card directly
65
+ const response = await this.request("POST", "/transaction/charge_authorization", {
66
+ authorization_code: options.authorizationCode,
67
+ email,
68
+ amount: amountInMinor,
69
+ currency: this.currency,
70
+ reference,
71
+ metadata: {
72
+ agentId,
73
+ reason: reason.slice(0, 500),
74
+ source: "mnemopay",
75
+ ...options?.metadata,
76
+ },
77
+ });
78
+ return {
79
+ externalId: reference,
80
+ status: response.data?.status ?? "pending",
81
+ reference,
82
+ };
83
+ }
84
+ // Initialize checkout transaction
85
+ const payload = {
86
+ email,
87
+ amount: amountInMinor,
88
+ currency: this.currency,
89
+ reference,
90
+ metadata: {
91
+ agentId,
92
+ reason: reason.slice(0, 500),
93
+ source: "mnemopay",
94
+ ...options?.metadata,
95
+ },
96
+ };
97
+ if (this.callbackUrl)
98
+ payload.callback_url = this.callbackUrl;
99
+ if (this.channels)
100
+ payload.channels = this.channels;
101
+ const response = await this.request("POST", "/transaction/initialize", payload);
102
+ return {
103
+ externalId: reference,
104
+ status: "initialized",
105
+ authorizationUrl: response.data?.authorization_url,
106
+ accessCode: response.data?.access_code,
107
+ reference,
108
+ };
109
+ }
110
+ /**
111
+ * Verify/capture a Paystack transaction.
112
+ * Call after user completes checkout or after charging saved card.
113
+ */
114
+ async capturePayment(externalId, _amount) {
115
+ if (!externalId || typeof externalId !== "string") {
116
+ throw new Error("Transaction reference is required");
117
+ }
118
+ // Idempotency: check if already processed
119
+ if (this.processedRefs.has(externalId)) {
120
+ // Re-verify to return current state
121
+ const response = await this.request("GET", `/transaction/verify/${encodeURIComponent(externalId)}`);
122
+ return this.mapVerifyResponse(response, externalId);
123
+ }
124
+ const response = await this.request("GET", `/transaction/verify/${encodeURIComponent(externalId)}`);
125
+ if (response.data?.status !== "success") {
126
+ return {
127
+ externalId,
128
+ status: response.data?.status ?? "failed",
129
+ amount: this.fromMinorUnits(response.data?.amount ?? 0),
130
+ currency: response.data?.currency ?? this.currency,
131
+ gatewayResponse: response.data?.gateway_response,
132
+ };
133
+ }
134
+ // Mark as processed (idempotency guard)
135
+ this.processedRefs.add(externalId);
136
+ return this.mapVerifyResponse(response, externalId);
137
+ }
138
+ /**
139
+ * Refund a Paystack transaction.
140
+ * Supports full and partial refunds.
141
+ */
142
+ async reversePayment(externalId, amount) {
143
+ if (!externalId || typeof externalId !== "string") {
144
+ throw new Error("Transaction reference is required");
145
+ }
146
+ if (!Number.isFinite(amount) || amount <= 0) {
147
+ throw new Error("Refund amount must be a positive finite number");
148
+ }
149
+ // First verify the transaction exists and get Paystack's internal ID
150
+ const verifyResponse = await this.request("GET", `/transaction/verify/${encodeURIComponent(externalId)}`);
151
+ const txId = verifyResponse.data?.id;
152
+ if (!txId) {
153
+ throw new Error(`Transaction ${externalId} not found on Paystack`);
154
+ }
155
+ const response = await this.request("POST", "/refund", {
156
+ transaction: txId,
157
+ amount: this.toMinorUnits(amount),
158
+ });
159
+ // Remove from processed refs so it can be re-verified
160
+ this.processedRefs.delete(externalId);
161
+ return {
162
+ externalId,
163
+ status: response.data?.status ?? "pending",
164
+ receiptId: response.data?.id?.toString(),
165
+ };
166
+ }
167
+ // ── Paystack-Specific Methods ───────────────────────────────────────────
168
+ /**
169
+ * Create a transfer recipient (bank account for payouts).
170
+ * Must be called before initiateTransfer.
171
+ */
172
+ async createTransferRecipient(name, accountNumber, bankCode, currency) {
173
+ if (!name || !accountNumber || !bankCode) {
174
+ throw new Error("Name, account number, and bank code are required");
175
+ }
176
+ // Resolve bank account first to verify it exists
177
+ const resolveResponse = await this.request("GET", `/bank/resolve?account_number=${encodeURIComponent(accountNumber)}&bank_code=${encodeURIComponent(bankCode)}`);
178
+ if (!resolveResponse.status) {
179
+ throw new Error(`Could not resolve bank account: ${resolveResponse.message}`);
180
+ }
181
+ const cur = currency ?? this.currency;
182
+ const response = await this.request("POST", "/transferrecipient", {
183
+ type: "nuban",
184
+ name,
185
+ account_number: accountNumber,
186
+ bank_code: bankCode,
187
+ currency: cur,
188
+ });
189
+ return {
190
+ recipientCode: response.data?.recipient_code,
191
+ name: response.data?.details?.account_name ?? name,
192
+ bankCode,
193
+ accountNumber,
194
+ currency: cur,
195
+ };
196
+ }
197
+ /**
198
+ * Initiate a bank transfer (payout).
199
+ * The recipient must already be created via createTransferRecipient.
200
+ */
201
+ async initiateTransfer(recipientCode, amount, reason, agentId) {
202
+ if (!recipientCode)
203
+ throw new Error("Recipient code is required");
204
+ if (!Number.isFinite(amount) || amount <= 0) {
205
+ throw new Error("Transfer amount must be a positive finite number");
206
+ }
207
+ const reference = `mnemo_xfer_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
208
+ const response = await this.request("POST", "/transfer", {
209
+ source: "balance",
210
+ amount: this.toMinorUnits(amount),
211
+ recipient: recipientCode,
212
+ reason: reason.slice(0, 500),
213
+ reference,
214
+ metadata: {
215
+ agentId,
216
+ source: "mnemopay",
217
+ },
218
+ });
219
+ return {
220
+ externalId: response.data?.transfer_code ?? reference,
221
+ status: response.data?.status ?? "pending",
222
+ reference,
223
+ amount,
224
+ transferStatus: response.data?.status ?? "pending",
225
+ };
226
+ }
227
+ /**
228
+ * Verify a webhook signature (HMAC-SHA512).
229
+ * Returns the parsed event if valid, throws if signature mismatch.
230
+ */
231
+ verifyWebhook(rawBody, signature) {
232
+ if (!signature)
233
+ throw new Error("Webhook signature is required");
234
+ if (!rawBody)
235
+ throw new Error("Webhook body is required");
236
+ const bodyStr = typeof rawBody === "string" ? rawBody : rawBody.toString("utf-8");
237
+ const expected = (0, crypto_1.createHmac)("sha512", this.secretKey)
238
+ .update(bodyStr)
239
+ .digest("hex");
240
+ // Timing-safe comparison to prevent timing attacks
241
+ const sigBuffer = Buffer.from(signature, "hex");
242
+ const expectedBuffer = Buffer.from(expected, "hex");
243
+ if (sigBuffer.length !== expectedBuffer.length || !(0, crypto_1.timingSafeEqual)(sigBuffer, expectedBuffer)) {
244
+ throw new Error("Invalid webhook signature");
245
+ }
246
+ const event = JSON.parse(bodyStr);
247
+ return event;
248
+ }
249
+ /**
250
+ * Resolve a bank account — verify the account name matches.
251
+ */
252
+ async resolveBank(accountNumber, bankCode) {
253
+ const response = await this.request("GET", `/bank/resolve?account_number=${encodeURIComponent(accountNumber)}&bank_code=${encodeURIComponent(bankCode)}`);
254
+ return {
255
+ accountName: response.data?.account_name ?? "",
256
+ accountNumber: response.data?.account_number ?? accountNumber,
257
+ };
258
+ }
259
+ /**
260
+ * List available banks for a given country/currency.
261
+ */
262
+ async listBanks(country = "nigeria", perPage = 100) {
263
+ const response = await this.request("GET", `/bank?country=${country}&perPage=${perPage}`);
264
+ return (response.data ?? []).map((b) => ({
265
+ name: b.name,
266
+ code: b.code,
267
+ }));
268
+ }
269
+ // ── Response Mapping ─────────────────────────────────────────────────────
270
+ mapVerifyResponse(response, externalId) {
271
+ const data = response.data ?? {};
272
+ const auth = data.authorization;
273
+ return {
274
+ externalId,
275
+ status: data.status ?? "unknown",
276
+ amount: this.fromMinorUnits(data.amount ?? 0),
277
+ currency: data.currency ?? this.currency,
278
+ customerEmail: data.customer?.email,
279
+ authorization: auth ? {
280
+ authorizationCode: auth.authorization_code,
281
+ cardType: auth.card_type,
282
+ last4: auth.last4,
283
+ bank: auth.bank,
284
+ reusable: auth.reusable ?? false,
285
+ } : undefined,
286
+ metadata: data.metadata,
287
+ gatewayResponse: data.gateway_response,
288
+ paidAt: data.paid_at,
289
+ receiptId: data.id?.toString(),
290
+ };
291
+ }
292
+ // ── Currency Conversion ─────────────────────────────────────────────────
293
+ /**
294
+ * Convert major currency units to minor units (e.g., Naira → kobo).
295
+ * Paystack API expects amounts in minor units.
296
+ */
297
+ toMinorUnits(amount) {
298
+ return Math.round(amount * 100);
299
+ }
300
+ /**
301
+ * Convert minor units back to major units (e.g., kobo → Naira).
302
+ */
303
+ fromMinorUnits(minorAmount) {
304
+ return Math.round(minorAmount) / 100;
305
+ }
306
+ // ── HTTP Client ─────────────────────────────────────────────────────────
307
+ async request(method, path, body) {
308
+ const url = `${this.baseUrl}${path}`;
309
+ const controller = new AbortController();
310
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
311
+ try {
312
+ const res = await fetch(url, {
313
+ method,
314
+ headers: {
315
+ Authorization: `Bearer ${this.secretKey}`,
316
+ "Content-Type": "application/json",
317
+ },
318
+ body: body ? JSON.stringify(body) : undefined,
319
+ signal: controller.signal,
320
+ });
321
+ const json = await res.json().catch(() => ({}));
322
+ if (!res.ok) {
323
+ const msg = json.message || json.error || `Paystack API error (${res.status})`;
324
+ throw new Error(`Paystack ${method} ${path} failed: ${msg}`);
325
+ }
326
+ return json;
327
+ }
328
+ catch (err) {
329
+ if (err.name === "AbortError") {
330
+ throw new Error(`Paystack request timed out after ${this.timeoutMs}ms`);
331
+ }
332
+ throw err;
333
+ }
334
+ finally {
335
+ clearTimeout(timeout);
336
+ }
337
+ }
338
+ }
339
+ exports.PaystackRail = PaystackRail;
340
+ // ─── Nigerian Bank Codes (common) ──────────────────────────────────────────
341
+ exports.NIGERIAN_BANKS = {
342
+ "access": "044",
343
+ "citibank": "023",
344
+ "ecobank": "050",
345
+ "fidelity": "070",
346
+ "firstbank": "011",
347
+ "fcmb": "214",
348
+ "gtbank": "058",
349
+ "heritage": "030",
350
+ "keystone": "082",
351
+ "polaris": "076",
352
+ "providus": "101",
353
+ "stanbic": "221",
354
+ "standard": "068",
355
+ "sterling": "232",
356
+ "uba": "033",
357
+ "union": "032",
358
+ "unity": "215",
359
+ "wema": "035",
360
+ "zenith": "057",
361
+ "kuda": "50211",
362
+ "opay": "999992",
363
+ "palmpay": "999991",
364
+ "moniepoint": "50515",
365
+ };
366
+ //# sourceMappingURL=paystack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paystack.js","sourceRoot":"","sources":["../../src/rails/paystack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mnemopay/sdk",
3
- "version": "0.7.5",
4
- "description": "Give any AI agent memory and a wallet in 5 lines. Unified SDK for Mnemosyne (cognitive memory) + AgentPay (escrow economics).",
3
+ "version": "0.8.0",
4
+ "description": "Give your AI agents real superpowers. Memory + Payments + Identity in one SDK. Double-entry ledger, escrow, fraud detection, multi-agent commerce.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
@@ -57,29 +57,31 @@
57
57
  "keywords": [
58
58
  "ai-agent",
59
59
  "agent-memory",
60
- "memory",
61
60
  "agent-wallet",
61
+ "agent-payments",
62
+ "agent-identity",
63
+ "agent-banking",
62
64
  "payment",
63
65
  "escrow",
64
- "llm",
65
- "openai",
66
- "anthropic",
67
- "claude",
68
- "aws-bedrock",
69
- "google-vertex",
70
- "langchain",
71
- "langgraph",
66
+ "double-entry-ledger",
67
+ "fraud-detection",
68
+ "multi-agent",
72
69
  "mcp",
73
70
  "model-context-protocol",
71
+ "paystack",
72
+ "stripe",
73
+ "lightning",
74
74
  "cognitive-memory",
75
- "wallet",
76
75
  "reputation",
77
76
  "agent-sdk",
78
- "multi-agent",
79
77
  "ai-memory",
80
- "session-memory",
81
- "fraud-detection",
82
- "micropayments"
78
+ "micropayments",
79
+ "llm",
80
+ "openai",
81
+ "anthropic",
82
+ "claude",
83
+ "langchain",
84
+ "langgraph"
83
85
  ],
84
86
  "author": "Jerry Omiagbo <jeremiah@getbizsuite.com>",
85
87
  "license": "MIT",