@nokinc-flur/sdk 2.3.0 → 2.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.
- package/dist/index.cjs +183 -305
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -188
- package/dist/index.d.ts +68 -188
- package/dist/index.js +181 -295
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -109,6 +109,7 @@ __export(index_exports, {
|
|
|
109
109
|
OFFLINE_SMS_SETTLE_SIGNATURE_BYTES: () => OFFLINE_SMS_SETTLE_SIGNATURE_BYTES,
|
|
110
110
|
OFFLINE_SMS_SETTLE_TOKEN_BYTES: () => OFFLINE_SMS_SETTLE_TOKEN_BYTES,
|
|
111
111
|
OFFLINE_SMS_SETTLE_VERSION: () => OFFLINE_SMS_SETTLE_VERSION,
|
|
112
|
+
OacPresentmentRequestSchema: () => OacPresentmentRequestSchema,
|
|
112
113
|
OfflineClaimArtifactSchema: () => OfflineClaimArtifactSchema,
|
|
113
114
|
OfflinePaymentAuthorizationArtifactSchema: () => OfflinePaymentAuthorizationArtifactSchema,
|
|
114
115
|
OfflinePaymentAuthorizationSchema: () => OfflinePaymentAuthorizationSchema,
|
|
@@ -126,9 +127,6 @@ __export(index_exports, {
|
|
|
126
127
|
PASS_STATES: () => PASS_STATES,
|
|
127
128
|
PAYLOAD_FORMAT_INDICATOR_VALUE: () => PAYLOAD_FORMAT_INDICATOR_VALUE,
|
|
128
129
|
PAYOUT_DESTINATION_STATUSES: () => PAYOUT_DESTINATION_STATUSES,
|
|
129
|
-
PAY_CARD_DEFAULT_TTL_MS: () => PAY_CARD_DEFAULT_TTL_MS,
|
|
130
|
-
PAY_CARD_REFRESH_THRESHOLD_MS: () => PAY_CARD_REFRESH_THRESHOLD_MS,
|
|
131
|
-
PAY_CARD_URI_PREFIX: () => PAY_CARD_URI_PREFIX,
|
|
132
130
|
POINT_OF_INITIATION: () => POINT_OF_INITIATION,
|
|
133
131
|
PartnerFundingEventInputSchema: () => PartnerFundingEventInputSchema,
|
|
134
132
|
PartnerFundingSchema: () => PartnerFundingSchema,
|
|
@@ -136,7 +134,6 @@ __export(index_exports, {
|
|
|
136
134
|
PassArtifactSchema: () => PassArtifactSchema,
|
|
137
135
|
PassMetadataSchema: () => PassMetadataSchema,
|
|
138
136
|
PassSchema: () => PassSchema,
|
|
139
|
-
PayCardArtifactSchema: () => PayCardArtifactSchema,
|
|
140
137
|
PayCollectionInputSchema: () => PayCollectionInputSchema,
|
|
141
138
|
PaymentClaimSchema: () => PaymentClaimSchema,
|
|
142
139
|
PaymentIntentArtifactSchema: () => PaymentIntentArtifactSchema,
|
|
@@ -175,7 +172,6 @@ __export(index_exports, {
|
|
|
175
172
|
buildConsumerPaymentRequest: () => buildConsumerPaymentRequest,
|
|
176
173
|
buildOAC: () => buildOAC,
|
|
177
174
|
buildPass: () => buildPass,
|
|
178
|
-
buildPayCardSigningInput: () => buildPayCardSigningInput,
|
|
179
175
|
buildPaymentRequest: () => buildPaymentRequest,
|
|
180
176
|
buildReceipt: () => buildReceipt,
|
|
181
177
|
buildRedemption: () => buildRedemption,
|
|
@@ -210,17 +206,16 @@ __export(index_exports, {
|
|
|
210
206
|
createPartnerFundingClient: () => createPartnerFundingClient,
|
|
211
207
|
createPartnerProfileAdminClient: () => createPartnerProfileAdminClient,
|
|
212
208
|
createPassesClient: () => createPassesClient,
|
|
213
|
-
createPayCardArtifactUri: () => createPayCardArtifactUri,
|
|
214
209
|
createReceiptArtifactUri: () => createReceiptArtifactUri,
|
|
215
210
|
createReceiptsClient: () => createReceiptsClient,
|
|
216
211
|
createSoftwareP256Signer: () => createSoftwareP256Signer,
|
|
217
212
|
decodeArtifactUri: () => decodeArtifactUri,
|
|
218
213
|
decodeAuthorizationQR: () => decodeAuthorizationQR,
|
|
219
214
|
decodeBase45: () => decodeBase45,
|
|
215
|
+
decodeConsumerOacRequest: () => decodeConsumerOacRequest,
|
|
220
216
|
decodeConsumerSettlementReceiptQR: () => decodeConsumerSettlementReceiptQR,
|
|
221
217
|
decodeOfflineClaimSmsMessage: () => decodeOfflineClaimSmsMessage,
|
|
222
218
|
decodeOfflineSmsSettleToken: () => decodeOfflineSmsSettleToken,
|
|
223
|
-
decodePayCardArtifact: () => decodePayCardArtifact,
|
|
224
219
|
decodePaymentRequestQR: () => decodePaymentRequestQR,
|
|
225
220
|
decodeUnverifiedConsumerOacQR: () => decodeUnverifiedConsumerOacQR,
|
|
226
221
|
decodeUnverifiedConsumerSettlementReceiptQR: () => decodeUnverifiedConsumerSettlementReceiptQR,
|
|
@@ -240,13 +235,11 @@ __export(index_exports, {
|
|
|
240
235
|
generateDynamicQR: () => generateDynamicQR,
|
|
241
236
|
generateStaticQR: () => generateStaticQR,
|
|
242
237
|
init: () => init,
|
|
243
|
-
inspectPayCardFreshness: () => inspectPayCardFreshness,
|
|
244
238
|
isConsumerOacQR: () => isConsumerOacQR,
|
|
245
239
|
isConsumerPaymentRequestExpired: () => isConsumerPaymentRequestExpired,
|
|
246
240
|
isHardenedArtifactType: () => isHardenedArtifactType,
|
|
247
241
|
isKnownArtifactType: () => isKnownArtifactType,
|
|
248
242
|
isPassWithinValidity: () => isPassWithinValidity,
|
|
249
|
-
isPayCardArtifactUri: () => isPayCardArtifactUri,
|
|
250
243
|
moneyMinorToNumber: () => moneyMinorToNumber,
|
|
251
244
|
normalizeE164: () => normalizeE164,
|
|
252
245
|
parseAmountInput: () => parseAmountInput,
|
|
@@ -275,7 +268,6 @@ __export(index_exports, {
|
|
|
275
268
|
verifyOacOffline: () => verifyOacOffline,
|
|
276
269
|
verifyOfflineSmsSettleToken: () => verifyOfflineSmsSettleToken,
|
|
277
270
|
verifyPass: () => verifyPass,
|
|
278
|
-
verifyPayCardArtifact: () => verifyPayCardArtifact,
|
|
279
271
|
verifyPaymentRequest: () => verifyPaymentRequest,
|
|
280
272
|
verifyReceipt: () => verifyReceipt,
|
|
281
273
|
verifyRedemption: () => verifyRedemption,
|
|
@@ -3867,6 +3859,7 @@ function base64UrlDecodeUtf8(input) {
|
|
|
3867
3859
|
}
|
|
3868
3860
|
|
|
3869
3861
|
// src/me-offline/oac.ts
|
|
3862
|
+
var import_zod15 = require("zod");
|
|
3870
3863
|
var CONSUMER_OAC_DOMAIN = "flur:consumer-offline:v1:oac";
|
|
3871
3864
|
function consumerOacSigningPayload(oac) {
|
|
3872
3865
|
return { domain: CONSUMER_OAC_DOMAIN, ...oac };
|
|
@@ -3909,15 +3902,28 @@ var CONSUMER_OAC_QR_PREFIX = "FLUROAC1.";
|
|
|
3909
3902
|
function isConsumerOacQR(value) {
|
|
3910
3903
|
return value.startsWith(CONSUMER_OAC_QR_PREFIX);
|
|
3911
3904
|
}
|
|
3912
|
-
|
|
3905
|
+
var OacPresentmentRequestSchema = import_zod15.z.object({
|
|
3906
|
+
/** Requested amount in minor units (kobo). */
|
|
3907
|
+
amountMinor: import_zod15.z.number().int().positive().max(1e12).optional(),
|
|
3908
|
+
/** Purpose/intent code (mirrors the NIBSS intent vocabulary). */
|
|
3909
|
+
intent: import_zod15.z.string().min(1).max(32).optional(),
|
|
3910
|
+
/** Free-text reference / note. */
|
|
3911
|
+
reference: import_zod15.z.string().min(1).max(64).optional()
|
|
3912
|
+
}).strict();
|
|
3913
|
+
function encodeConsumerOacQR(signed, request) {
|
|
3913
3914
|
const parsed = SignedConsumerOACSchema.parse(signed);
|
|
3914
|
-
|
|
3915
|
+
const base = `${CONSUMER_OAC_QR_PREFIX}${base64UrlEncodeUtf82(JSON.stringify(parsed))}`;
|
|
3916
|
+
if (request === void 0) return base;
|
|
3917
|
+
const parsedRequest = OacPresentmentRequestSchema.parse(request);
|
|
3918
|
+
if (Object.keys(parsedRequest).length === 0) return base;
|
|
3919
|
+
return `${base}.${base64UrlEncodeUtf82(JSON.stringify(parsedRequest))}`;
|
|
3915
3920
|
}
|
|
3916
3921
|
function decodeUnverifiedConsumerOacQR(value) {
|
|
3917
3922
|
if (!value.startsWith(CONSUMER_OAC_QR_PREFIX)) {
|
|
3918
3923
|
throw new Error("not a Flur consumer OAC QR");
|
|
3919
3924
|
}
|
|
3920
|
-
const
|
|
3925
|
+
const remainder = value.slice(CONSUMER_OAC_QR_PREFIX.length);
|
|
3926
|
+
const encoded = remainder.split(".", 1)[0];
|
|
3921
3927
|
let raw;
|
|
3922
3928
|
try {
|
|
3923
3929
|
raw = JSON.parse(base64UrlDecodeUtf82(encoded));
|
|
@@ -3926,6 +3932,21 @@ function decodeUnverifiedConsumerOacQR(value) {
|
|
|
3926
3932
|
}
|
|
3927
3933
|
return SignedConsumerOACSchema.parse(raw);
|
|
3928
3934
|
}
|
|
3935
|
+
function decodeConsumerOacRequest(value) {
|
|
3936
|
+
if (!value.startsWith(CONSUMER_OAC_QR_PREFIX)) return null;
|
|
3937
|
+
const remainder = value.slice(CONSUMER_OAC_QR_PREFIX.length);
|
|
3938
|
+
const dot = remainder.indexOf(".");
|
|
3939
|
+
if (dot < 0) return null;
|
|
3940
|
+
const suffix = remainder.slice(dot + 1);
|
|
3941
|
+
if (suffix.length === 0) return null;
|
|
3942
|
+
try {
|
|
3943
|
+
const raw = JSON.parse(base64UrlDecodeUtf82(suffix));
|
|
3944
|
+
const parsed = OacPresentmentRequestSchema.safeParse(raw);
|
|
3945
|
+
return parsed.success ? parsed.data : null;
|
|
3946
|
+
} catch {
|
|
3947
|
+
return null;
|
|
3948
|
+
}
|
|
3949
|
+
}
|
|
3929
3950
|
function base64UrlEncodeUtf82(input) {
|
|
3930
3951
|
const bytes = new TextEncoder().encode(input);
|
|
3931
3952
|
let binary = "";
|
|
@@ -4221,14 +4242,14 @@ function base64UrlToBytes(input) {
|
|
|
4221
4242
|
}
|
|
4222
4243
|
|
|
4223
4244
|
// src/partner-funding/client.ts
|
|
4224
|
-
var
|
|
4225
|
-
var MinorString =
|
|
4226
|
-
var PositiveMinor =
|
|
4227
|
-
|
|
4228
|
-
|
|
4245
|
+
var import_zod16 = require("zod");
|
|
4246
|
+
var MinorString = import_zod16.z.string().regex(/^-?\d+$/);
|
|
4247
|
+
var PositiveMinor = import_zod16.z.union([
|
|
4248
|
+
import_zod16.z.number().int().positive(),
|
|
4249
|
+
import_zod16.z.string().regex(/^[1-9]\d{0,18}$/)
|
|
4229
4250
|
]);
|
|
4230
|
-
var Currency =
|
|
4231
|
-
var Metadata =
|
|
4251
|
+
var Currency = import_zod16.z.string().trim().length(3).transform((v) => v.toUpperCase());
|
|
4252
|
+
var Metadata = import_zod16.z.record(import_zod16.z.unknown());
|
|
4232
4253
|
var PARTNER_KINDS = ["bank", "merchant"];
|
|
4233
4254
|
var CUSTODIAL_MODES = ["agent_of_bank", "flur_virtual_pool"];
|
|
4234
4255
|
var PARTNER_PROFILE_STATUSES = [
|
|
@@ -4255,126 +4276,126 @@ var WITHDRAWAL_STATES = [
|
|
|
4255
4276
|
"failed",
|
|
4256
4277
|
"reversed"
|
|
4257
4278
|
];
|
|
4258
|
-
var PartnerProfileSchema =
|
|
4259
|
-
partnerAccountId:
|
|
4260
|
-
kind:
|
|
4261
|
-
custodialMode:
|
|
4262
|
-
displayName:
|
|
4263
|
-
bankCode:
|
|
4264
|
-
poolAccountNumber:
|
|
4265
|
-
status:
|
|
4279
|
+
var PartnerProfileSchema = import_zod16.z.object({
|
|
4280
|
+
partnerAccountId: import_zod16.z.string().uuid(),
|
|
4281
|
+
kind: import_zod16.z.enum(PARTNER_KINDS),
|
|
4282
|
+
custodialMode: import_zod16.z.enum(CUSTODIAL_MODES),
|
|
4283
|
+
displayName: import_zod16.z.string(),
|
|
4284
|
+
bankCode: import_zod16.z.string().nullable(),
|
|
4285
|
+
poolAccountNumber: import_zod16.z.string().nullable(),
|
|
4286
|
+
status: import_zod16.z.enum(PARTNER_PROFILE_STATUSES),
|
|
4266
4287
|
metadata: Metadata,
|
|
4267
|
-
createdAtMs:
|
|
4268
|
-
updatedAtMs:
|
|
4288
|
+
createdAtMs: import_zod16.z.number().int().nonnegative(),
|
|
4289
|
+
updatedAtMs: import_zod16.z.number().int().nonnegative()
|
|
4269
4290
|
});
|
|
4270
|
-
var UpsertPartnerProfileInputSchema =
|
|
4271
|
-
kind:
|
|
4272
|
-
custodialMode:
|
|
4273
|
-
displayName:
|
|
4274
|
-
bankCode:
|
|
4275
|
-
poolAccountNumber:
|
|
4291
|
+
var UpsertPartnerProfileInputSchema = import_zod16.z.object({
|
|
4292
|
+
kind: import_zod16.z.enum(PARTNER_KINDS),
|
|
4293
|
+
custodialMode: import_zod16.z.enum(CUSTODIAL_MODES),
|
|
4294
|
+
displayName: import_zod16.z.string().trim().min(1).max(200),
|
|
4295
|
+
bankCode: import_zod16.z.string().trim().min(1).max(64).optional(),
|
|
4296
|
+
poolAccountNumber: import_zod16.z.string().trim().min(1).max(64).optional(),
|
|
4276
4297
|
metadata: Metadata.optional()
|
|
4277
4298
|
});
|
|
4278
|
-
var PartnerFundingEventInputSchema =
|
|
4279
|
-
externalRef:
|
|
4280
|
-
direction:
|
|
4281
|
-
userId:
|
|
4282
|
-
accountId:
|
|
4299
|
+
var PartnerFundingEventInputSchema = import_zod16.z.object({
|
|
4300
|
+
externalRef: import_zod16.z.string().trim().min(8).max(128),
|
|
4301
|
+
direction: import_zod16.z.enum(PARTNER_FUNDING_DIRECTIONS).optional(),
|
|
4302
|
+
userId: import_zod16.z.string().uuid().optional(),
|
|
4303
|
+
accountId: import_zod16.z.string().uuid().optional(),
|
|
4283
4304
|
amountMinor: PositiveMinor,
|
|
4284
4305
|
currency: Currency,
|
|
4285
|
-
fundingSource:
|
|
4306
|
+
fundingSource: import_zod16.z.string().trim().min(1).max(64).optional(),
|
|
4286
4307
|
providerMetadata: Metadata.optional()
|
|
4287
4308
|
});
|
|
4288
|
-
var PartnerFundingSchema =
|
|
4289
|
-
fundingId:
|
|
4290
|
-
partnerId:
|
|
4291
|
-
accountId:
|
|
4292
|
-
userId:
|
|
4293
|
-
direction:
|
|
4294
|
-
currency:
|
|
4309
|
+
var PartnerFundingSchema = import_zod16.z.object({
|
|
4310
|
+
fundingId: import_zod16.z.string().uuid(),
|
|
4311
|
+
partnerId: import_zod16.z.string().uuid(),
|
|
4312
|
+
accountId: import_zod16.z.string().uuid(),
|
|
4313
|
+
userId: import_zod16.z.string().uuid().nullable(),
|
|
4314
|
+
direction: import_zod16.z.enum(PARTNER_FUNDING_DIRECTIONS),
|
|
4315
|
+
currency: import_zod16.z.string(),
|
|
4295
4316
|
amountMinor: MinorString,
|
|
4296
|
-
externalRef:
|
|
4297
|
-
status:
|
|
4298
|
-
fundingSource:
|
|
4299
|
-
ledgerRef:
|
|
4317
|
+
externalRef: import_zod16.z.string(),
|
|
4318
|
+
status: import_zod16.z.enum(PARTNER_FUNDING_STATUSES),
|
|
4319
|
+
fundingSource: import_zod16.z.string(),
|
|
4320
|
+
ledgerRef: import_zod16.z.string(),
|
|
4300
4321
|
providerMetadata: Metadata,
|
|
4301
|
-
createdAtMs:
|
|
4302
|
-
updatedAtMs:
|
|
4322
|
+
createdAtMs: import_zod16.z.number().int().nonnegative(),
|
|
4323
|
+
updatedAtMs: import_zod16.z.number().int().nonnegative()
|
|
4303
4324
|
});
|
|
4304
|
-
var IngestFundingResultSchema =
|
|
4325
|
+
var IngestFundingResultSchema = import_zod16.z.object({
|
|
4305
4326
|
funding: PartnerFundingSchema,
|
|
4306
|
-
replayed:
|
|
4327
|
+
replayed: import_zod16.z.boolean()
|
|
4307
4328
|
});
|
|
4308
|
-
var PayoutDestinationSchema =
|
|
4309
|
-
destinationId:
|
|
4310
|
-
accountId:
|
|
4311
|
-
partnerId:
|
|
4312
|
-
bankCode:
|
|
4313
|
-
accountNumber:
|
|
4314
|
-
accountName:
|
|
4315
|
-
status:
|
|
4316
|
-
verifiedAtMs:
|
|
4329
|
+
var PayoutDestinationSchema = import_zod16.z.object({
|
|
4330
|
+
destinationId: import_zod16.z.string().uuid(),
|
|
4331
|
+
accountId: import_zod16.z.string().uuid(),
|
|
4332
|
+
partnerId: import_zod16.z.string().uuid(),
|
|
4333
|
+
bankCode: import_zod16.z.string(),
|
|
4334
|
+
accountNumber: import_zod16.z.string(),
|
|
4335
|
+
accountName: import_zod16.z.string(),
|
|
4336
|
+
status: import_zod16.z.enum(PAYOUT_DESTINATION_STATUSES),
|
|
4337
|
+
verifiedAtMs: import_zod16.z.number().int().nonnegative().nullable(),
|
|
4317
4338
|
metadata: Metadata,
|
|
4318
|
-
createdAtMs:
|
|
4319
|
-
updatedAtMs:
|
|
4339
|
+
createdAtMs: import_zod16.z.number().int().nonnegative(),
|
|
4340
|
+
updatedAtMs: import_zod16.z.number().int().nonnegative()
|
|
4320
4341
|
});
|
|
4321
|
-
var CreatePayoutDestinationInputSchema =
|
|
4322
|
-
partnerId:
|
|
4323
|
-
bankCode:
|
|
4324
|
-
accountNumber:
|
|
4325
|
-
accountName:
|
|
4342
|
+
var CreatePayoutDestinationInputSchema = import_zod16.z.object({
|
|
4343
|
+
partnerId: import_zod16.z.string().uuid(),
|
|
4344
|
+
bankCode: import_zod16.z.string().trim().min(1).max(32),
|
|
4345
|
+
accountNumber: import_zod16.z.string().trim().min(4).max(64),
|
|
4346
|
+
accountName: import_zod16.z.string().trim().min(1).max(200),
|
|
4326
4347
|
metadata: Metadata.optional()
|
|
4327
4348
|
});
|
|
4328
|
-
var ListPayoutDestinationsResultSchema =
|
|
4329
|
-
items:
|
|
4349
|
+
var ListPayoutDestinationsResultSchema = import_zod16.z.object({
|
|
4350
|
+
items: import_zod16.z.array(PayoutDestinationSchema)
|
|
4330
4351
|
});
|
|
4331
|
-
var WithdrawalSchema =
|
|
4332
|
-
withdrawalId:
|
|
4333
|
-
accountId:
|
|
4334
|
-
userId:
|
|
4335
|
-
partnerId:
|
|
4336
|
-
destinationId:
|
|
4337
|
-
currency:
|
|
4352
|
+
var WithdrawalSchema = import_zod16.z.object({
|
|
4353
|
+
withdrawalId: import_zod16.z.string().uuid(),
|
|
4354
|
+
accountId: import_zod16.z.string().uuid(),
|
|
4355
|
+
userId: import_zod16.z.string().uuid(),
|
|
4356
|
+
partnerId: import_zod16.z.string().uuid(),
|
|
4357
|
+
destinationId: import_zod16.z.string().uuid(),
|
|
4358
|
+
currency: import_zod16.z.string(),
|
|
4338
4359
|
amountMinor: MinorString,
|
|
4339
|
-
state:
|
|
4340
|
-
idempotencyKey:
|
|
4341
|
-
providerRef:
|
|
4342
|
-
lastError:
|
|
4343
|
-
ledgerRef:
|
|
4344
|
-
reverseLedgerRef:
|
|
4360
|
+
state: import_zod16.z.enum(WITHDRAWAL_STATES),
|
|
4361
|
+
idempotencyKey: import_zod16.z.string(),
|
|
4362
|
+
providerRef: import_zod16.z.string().nullable(),
|
|
4363
|
+
lastError: import_zod16.z.string().nullable(),
|
|
4364
|
+
ledgerRef: import_zod16.z.string(),
|
|
4365
|
+
reverseLedgerRef: import_zod16.z.string().nullable(),
|
|
4345
4366
|
metadata: Metadata,
|
|
4346
|
-
createdAtMs:
|
|
4347
|
-
updatedAtMs:
|
|
4367
|
+
createdAtMs: import_zod16.z.number().int().nonnegative(),
|
|
4368
|
+
updatedAtMs: import_zod16.z.number().int().nonnegative()
|
|
4348
4369
|
});
|
|
4349
|
-
var CreateWithdrawalInputSchema =
|
|
4350
|
-
destinationId:
|
|
4370
|
+
var CreateWithdrawalInputSchema = import_zod16.z.object({
|
|
4371
|
+
destinationId: import_zod16.z.string().uuid(),
|
|
4351
4372
|
amountMinor: PositiveMinor,
|
|
4352
4373
|
currency: Currency,
|
|
4353
|
-
idempotencyKey:
|
|
4374
|
+
idempotencyKey: import_zod16.z.string().trim().min(8).max(128),
|
|
4354
4375
|
metadata: Metadata.optional()
|
|
4355
4376
|
});
|
|
4356
|
-
var CreateWithdrawalResultSchema =
|
|
4377
|
+
var CreateWithdrawalResultSchema = import_zod16.z.object({
|
|
4357
4378
|
withdrawal: WithdrawalSchema,
|
|
4358
|
-
replayed:
|
|
4379
|
+
replayed: import_zod16.z.boolean()
|
|
4359
4380
|
});
|
|
4360
|
-
var PayoutEventInputSchema =
|
|
4361
|
-
externalRef:
|
|
4362
|
-
withdrawalId:
|
|
4363
|
-
state:
|
|
4364
|
-
providerRef:
|
|
4365
|
-
failureCode:
|
|
4366
|
-
failureMessage:
|
|
4381
|
+
var PayoutEventInputSchema = import_zod16.z.object({
|
|
4382
|
+
externalRef: import_zod16.z.string().trim().min(8).max(128),
|
|
4383
|
+
withdrawalId: import_zod16.z.string().uuid().optional(),
|
|
4384
|
+
state: import_zod16.z.enum(["submitted", "processing", "paid", "failed"]),
|
|
4385
|
+
providerRef: import_zod16.z.string().trim().min(1).max(128).optional(),
|
|
4386
|
+
failureCode: import_zod16.z.string().trim().max(64).optional(),
|
|
4387
|
+
failureMessage: import_zod16.z.string().trim().max(512).optional(),
|
|
4367
4388
|
providerMetadata: Metadata.optional()
|
|
4368
4389
|
});
|
|
4369
|
-
var RecordPayoutEventResultSchema =
|
|
4390
|
+
var RecordPayoutEventResultSchema = import_zod16.z.object({
|
|
4370
4391
|
withdrawal: WithdrawalSchema,
|
|
4371
|
-
replayed:
|
|
4392
|
+
replayed: import_zod16.z.boolean()
|
|
4372
4393
|
});
|
|
4373
|
-
var ReconciliationReportSchema =
|
|
4374
|
-
partnerId:
|
|
4375
|
-
currency:
|
|
4376
|
-
fromMs:
|
|
4377
|
-
toMs:
|
|
4394
|
+
var ReconciliationReportSchema = import_zod16.z.object({
|
|
4395
|
+
partnerId: import_zod16.z.string().uuid(),
|
|
4396
|
+
currency: import_zod16.z.string(),
|
|
4397
|
+
fromMs: import_zod16.z.number().int().nonnegative(),
|
|
4398
|
+
toMs: import_zod16.z.number().int().nonnegative(),
|
|
4378
4399
|
fundingsCreditMinor: MinorString,
|
|
4379
4400
|
fundingsDebitMinor: MinorString,
|
|
4380
4401
|
withdrawalsPaidMinor: MinorString,
|
|
@@ -4383,7 +4404,7 @@ var ReconciliationReportSchema = import_zod15.z.object({
|
|
|
4383
4404
|
expectedReserveBalanceMinor: MinorString,
|
|
4384
4405
|
actualReserveBalanceMinor: MinorString,
|
|
4385
4406
|
imbalanceMinor: MinorString,
|
|
4386
|
-
generatedAtMs:
|
|
4407
|
+
generatedAtMs: import_zod16.z.number().int().nonnegative()
|
|
4387
4408
|
});
|
|
4388
4409
|
function createPartnerFundingClient(partner) {
|
|
4389
4410
|
return {
|
|
@@ -4535,19 +4556,19 @@ function createPartnerProfileAdminClient(opts) {
|
|
|
4535
4556
|
}
|
|
4536
4557
|
|
|
4537
4558
|
// src/artifacts/envelope.ts
|
|
4538
|
-
var
|
|
4559
|
+
var import_zod17 = require("zod");
|
|
4539
4560
|
var FLUR_ARTIFACT_URI_SCHEME = "flur";
|
|
4540
4561
|
var FLUR_ARTIFACT_VERSION = 1;
|
|
4541
4562
|
var FLUR_ARTIFACT_URI_PREFIX = `${FLUR_ARTIFACT_URI_SCHEME}://v${FLUR_ARTIFACT_VERSION}/`;
|
|
4542
4563
|
var ArtifactTypeRe = /^[a-z][a-z0-9_]{1,63}$/;
|
|
4543
|
-
var ArtifactHeaderSchema =
|
|
4544
|
-
v:
|
|
4545
|
-
t:
|
|
4546
|
-
iss:
|
|
4547
|
-
kid:
|
|
4548
|
-
iat:
|
|
4549
|
-
exp:
|
|
4550
|
-
nonce:
|
|
4564
|
+
var ArtifactHeaderSchema = import_zod17.z.object({
|
|
4565
|
+
v: import_zod17.z.literal(FLUR_ARTIFACT_VERSION),
|
|
4566
|
+
t: import_zod17.z.string().regex(ArtifactTypeRe, "invalid artifact type"),
|
|
4567
|
+
iss: import_zod17.z.string().min(1).max(128),
|
|
4568
|
+
kid: import_zod17.z.string().min(1).max(128),
|
|
4569
|
+
iat: import_zod17.z.number().int().nonnegative(),
|
|
4570
|
+
exp: import_zod17.z.number().int().positive().optional(),
|
|
4571
|
+
nonce: import_zod17.z.string().min(8).max(64).regex(/^[A-Za-z0-9_-]+$/, "nonce must be url-safe")
|
|
4551
4572
|
});
|
|
4552
4573
|
var FlurArtifactError = class extends Error {
|
|
4553
4574
|
constructor(message, code) {
|
|
@@ -4686,7 +4707,7 @@ function verifyArtifactSignature(decoded, publicKeySpkiB64, options = {}) {
|
|
|
4686
4707
|
}
|
|
4687
4708
|
|
|
4688
4709
|
// src/artifacts/types.ts
|
|
4689
|
-
var
|
|
4710
|
+
var import_zod18 = require("zod");
|
|
4690
4711
|
var ARTIFACT_TYPES = {
|
|
4691
4712
|
OFFLINE_PAYMENT_AUTHORIZATION: "offline_payment_authorization",
|
|
4692
4713
|
RECEIPT: "receipt",
|
|
@@ -4699,37 +4720,34 @@ var ARTIFACT_TYPES = {
|
|
|
4699
4720
|
LEDGER_JOURNAL_ENTRY: "ledger_journal_entry",
|
|
4700
4721
|
STATEMENT: "statement",
|
|
4701
4722
|
PASS: "pass",
|
|
4702
|
-
IDENTITY: "identity"
|
|
4703
|
-
// Tier B: holder-signed identity attestation for offline trust. The
|
|
4704
|
-
// envelope.iat / envelope.exp express the card's canonical lifetime.
|
|
4705
|
-
PAY_CARD: "pay_card"
|
|
4723
|
+
IDENTITY: "identity"
|
|
4706
4724
|
};
|
|
4707
|
-
var HexString = (length) =>
|
|
4725
|
+
var HexString = (length) => import_zod18.z.string().regex(
|
|
4708
4726
|
new RegExp(`^[0-9a-fA-F]{${length * 2}}$`),
|
|
4709
4727
|
`expected ${length}-byte hex string`
|
|
4710
4728
|
);
|
|
4711
|
-
var OfflinePaymentAuthorizationArtifactSchema =
|
|
4729
|
+
var OfflinePaymentAuthorizationArtifactSchema = import_zod18.z.object({
|
|
4712
4730
|
authorization: OfflinePaymentAuthorizationSchema
|
|
4713
4731
|
});
|
|
4714
|
-
var ReceiptArtifactSchema =
|
|
4715
|
-
receiptId:
|
|
4716
|
-
paymentReference:
|
|
4717
|
-
payerUserId:
|
|
4718
|
-
payeeUserId:
|
|
4719
|
-
amountKobo:
|
|
4720
|
-
currency:
|
|
4721
|
-
channel:
|
|
4722
|
-
settledAtMs:
|
|
4723
|
-
ledgerTxnId:
|
|
4724
|
-
memo:
|
|
4732
|
+
var ReceiptArtifactSchema = import_zod18.z.object({
|
|
4733
|
+
receiptId: import_zod18.z.string().min(1).max(64),
|
|
4734
|
+
paymentReference: import_zod18.z.string().min(1).max(64),
|
|
4735
|
+
payerUserId: import_zod18.z.string().min(1).max(64).optional(),
|
|
4736
|
+
payeeUserId: import_zod18.z.string().min(1).max(64),
|
|
4737
|
+
amountKobo: import_zod18.z.number().int().positive(),
|
|
4738
|
+
currency: import_zod18.z.literal("NGN"),
|
|
4739
|
+
channel: import_zod18.z.enum(["online", "offline_reconciled", "pay_link", "nqr"]),
|
|
4740
|
+
settledAtMs: import_zod18.z.number().int().positive(),
|
|
4741
|
+
ledgerTxnId: import_zod18.z.string().min(1).max(64).optional(),
|
|
4742
|
+
memo: import_zod18.z.string().max(140).optional(),
|
|
4725
4743
|
hashChainPrev: HexString(32).optional()
|
|
4726
4744
|
});
|
|
4727
|
-
var ShortId =
|
|
4728
|
-
var PositiveInt =
|
|
4729
|
-
var NonNegativeInt =
|
|
4730
|
-
var Currency2 =
|
|
4731
|
-
var Memo =
|
|
4732
|
-
var NqrPaymentRequestArtifactSchema =
|
|
4745
|
+
var ShortId = import_zod18.z.string().min(1).max(64);
|
|
4746
|
+
var PositiveInt = import_zod18.z.number().int().positive();
|
|
4747
|
+
var NonNegativeInt = import_zod18.z.number().int().nonnegative();
|
|
4748
|
+
var Currency2 = import_zod18.z.literal("NGN");
|
|
4749
|
+
var Memo = import_zod18.z.string().max(140);
|
|
4750
|
+
var NqrPaymentRequestArtifactSchema = import_zod18.z.object({
|
|
4733
4751
|
requestId: ShortId,
|
|
4734
4752
|
payeeUserId: ShortId,
|
|
4735
4753
|
amountKobo: PositiveInt.optional(),
|
|
@@ -4737,7 +4755,7 @@ var NqrPaymentRequestArtifactSchema = import_zod17.z.object({
|
|
|
4737
4755
|
memo: Memo.optional(),
|
|
4738
4756
|
expiresAtMs: PositiveInt.optional()
|
|
4739
4757
|
});
|
|
4740
|
-
var PaymentIntentArtifactSchema =
|
|
4758
|
+
var PaymentIntentArtifactSchema = import_zod18.z.object({
|
|
4741
4759
|
intentId: ShortId,
|
|
4742
4760
|
payerUserId: ShortId,
|
|
4743
4761
|
payeeUserId: ShortId,
|
|
@@ -4746,7 +4764,7 @@ var PaymentIntentArtifactSchema = import_zod17.z.object({
|
|
|
4746
4764
|
idempotencyKey: ShortId,
|
|
4747
4765
|
createdAtMs: PositiveInt
|
|
4748
4766
|
});
|
|
4749
|
-
var OfflineClaimArtifactSchema =
|
|
4767
|
+
var OfflineClaimArtifactSchema = import_zod18.z.object({
|
|
4750
4768
|
claimId: ShortId,
|
|
4751
4769
|
authorizationId: ShortId,
|
|
4752
4770
|
payeeUserId: ShortId,
|
|
@@ -4755,10 +4773,10 @@ var OfflineClaimArtifactSchema = import_zod17.z.object({
|
|
|
4755
4773
|
claimedAtMs: PositiveInt,
|
|
4756
4774
|
paymentReference: ShortId.optional()
|
|
4757
4775
|
});
|
|
4758
|
-
var SettlementRecordArtifactSchema =
|
|
4776
|
+
var SettlementRecordArtifactSchema = import_zod18.z.object({
|
|
4759
4777
|
settlementId: ShortId,
|
|
4760
4778
|
ledgerTxnId: ShortId,
|
|
4761
|
-
sourceRefType:
|
|
4779
|
+
sourceRefType: import_zod18.z.enum([
|
|
4762
4780
|
"offline_authorization",
|
|
4763
4781
|
"offline_claim",
|
|
4764
4782
|
"transfer",
|
|
@@ -4769,12 +4787,12 @@ var SettlementRecordArtifactSchema = import_zod17.z.object({
|
|
|
4769
4787
|
currency: Currency2,
|
|
4770
4788
|
settledAtMs: PositiveInt
|
|
4771
4789
|
});
|
|
4772
|
-
var ReversalRecordArtifactSchema =
|
|
4790
|
+
var ReversalRecordArtifactSchema = import_zod18.z.object({
|
|
4773
4791
|
reversalId: ShortId,
|
|
4774
4792
|
originalTxnId: ShortId,
|
|
4775
4793
|
amountKobo: PositiveInt,
|
|
4776
4794
|
currency: Currency2,
|
|
4777
|
-
reason:
|
|
4795
|
+
reason: import_zod18.z.enum([
|
|
4778
4796
|
"user_dispute",
|
|
4779
4797
|
"fraud",
|
|
4780
4798
|
"duplicate",
|
|
@@ -4784,7 +4802,7 @@ var ReversalRecordArtifactSchema = import_zod17.z.object({
|
|
|
4784
4802
|
reversedAtMs: PositiveInt,
|
|
4785
4803
|
memo: Memo.optional()
|
|
4786
4804
|
});
|
|
4787
|
-
var LedgerJournalEntryArtifactSchema =
|
|
4805
|
+
var LedgerJournalEntryArtifactSchema = import_zod18.z.object({
|
|
4788
4806
|
entryId: ShortId,
|
|
4789
4807
|
journalId: ShortId,
|
|
4790
4808
|
debitAccountId: ShortId,
|
|
@@ -4795,13 +4813,13 @@ var LedgerJournalEntryArtifactSchema = import_zod17.z.object({
|
|
|
4795
4813
|
refType: ShortId.optional(),
|
|
4796
4814
|
refId: ShortId.optional()
|
|
4797
4815
|
});
|
|
4798
|
-
var StatementArtifactSchema =
|
|
4816
|
+
var StatementArtifactSchema = import_zod18.z.object({
|
|
4799
4817
|
statementId: ShortId,
|
|
4800
4818
|
userId: ShortId,
|
|
4801
4819
|
periodStartMs: PositiveInt,
|
|
4802
4820
|
periodEndMs: PositiveInt,
|
|
4803
|
-
openingBalanceKobo:
|
|
4804
|
-
closingBalanceKobo:
|
|
4821
|
+
openingBalanceKobo: import_zod18.z.number().int(),
|
|
4822
|
+
closingBalanceKobo: import_zod18.z.number().int(),
|
|
4805
4823
|
transactionCount: NonNegativeInt,
|
|
4806
4824
|
currency: Currency2,
|
|
4807
4825
|
hashChainPrev: HexString(32).optional()
|
|
@@ -4809,16 +4827,16 @@ var StatementArtifactSchema = import_zod17.z.object({
|
|
|
4809
4827
|
message: "periodEndMs must be greater than periodStartMs",
|
|
4810
4828
|
path: ["periodEndMs"]
|
|
4811
4829
|
});
|
|
4812
|
-
var PassArtifactSchema =
|
|
4830
|
+
var PassArtifactSchema = import_zod18.z.object({
|
|
4813
4831
|
passId: ShortId,
|
|
4814
4832
|
holderId: ShortId,
|
|
4815
|
-
category:
|
|
4816
|
-
title:
|
|
4833
|
+
category: import_zod18.z.enum(["membership", "ticket", "loyalty", "access", "voucher"]),
|
|
4834
|
+
title: import_zod18.z.string().min(1).max(120),
|
|
4817
4835
|
validFromMs: PositiveInt,
|
|
4818
4836
|
validUntilMs: PositiveInt.optional(),
|
|
4819
|
-
metadata:
|
|
4820
|
-
|
|
4821
|
-
|
|
4837
|
+
metadata: import_zod18.z.record(
|
|
4838
|
+
import_zod18.z.string().min(1).max(64),
|
|
4839
|
+
import_zod18.z.union([import_zod18.z.string().max(280), import_zod18.z.number(), import_zod18.z.boolean()])
|
|
4822
4840
|
).optional()
|
|
4823
4841
|
}).refine(
|
|
4824
4842
|
(v) => v.validUntilMs === void 0 || v.validUntilMs > v.validFromMs,
|
|
@@ -4827,10 +4845,10 @@ var PassArtifactSchema = import_zod17.z.object({
|
|
|
4827
4845
|
path: ["validUntilMs"]
|
|
4828
4846
|
}
|
|
4829
4847
|
);
|
|
4830
|
-
var IdentityArtifactSchema =
|
|
4848
|
+
var IdentityArtifactSchema = import_zod18.z.object({
|
|
4831
4849
|
attestationId: ShortId,
|
|
4832
4850
|
subjectId: ShortId,
|
|
4833
|
-
claimType:
|
|
4851
|
+
claimType: import_zod18.z.enum([
|
|
4834
4852
|
"phone_verified",
|
|
4835
4853
|
"email_verified",
|
|
4836
4854
|
"bvn_verified",
|
|
@@ -4840,12 +4858,6 @@ var IdentityArtifactSchema = import_zod17.z.object({
|
|
|
4840
4858
|
claimValueHash: HexString(32),
|
|
4841
4859
|
attestedAtMs: PositiveInt
|
|
4842
4860
|
});
|
|
4843
|
-
var PayCardArtifactSchema = import_zod17.z.object({
|
|
4844
|
-
userId: ShortId,
|
|
4845
|
-
phoneE164: import_zod17.z.string().regex(/^\+[1-9]\d{7,14}$/, "phoneE164 must be normalised E.164"),
|
|
4846
|
-
displayName: import_zod17.z.string().min(1).max(64),
|
|
4847
|
-
devicePubKeySpkiB64: import_zod17.z.string().min(64).max(256).regex(/^[A-Za-z0-9+/]+=*$/, "devicePubKeySpkiB64 must be standard base64")
|
|
4848
|
-
});
|
|
4849
4861
|
var ARTIFACT_BODY_SCHEMAS = {
|
|
4850
4862
|
[ARTIFACT_TYPES.OFFLINE_PAYMENT_AUTHORIZATION]: OfflinePaymentAuthorizationArtifactSchema,
|
|
4851
4863
|
[ARTIFACT_TYPES.RECEIPT]: ReceiptArtifactSchema,
|
|
@@ -4857,8 +4869,7 @@ var ARTIFACT_BODY_SCHEMAS = {
|
|
|
4857
4869
|
[ARTIFACT_TYPES.LEDGER_JOURNAL_ENTRY]: LedgerJournalEntryArtifactSchema,
|
|
4858
4870
|
[ARTIFACT_TYPES.STATEMENT]: StatementArtifactSchema,
|
|
4859
4871
|
[ARTIFACT_TYPES.PASS]: PassArtifactSchema,
|
|
4860
|
-
[ARTIFACT_TYPES.IDENTITY]: IdentityArtifactSchema
|
|
4861
|
-
[ARTIFACT_TYPES.PAY_CARD]: PayCardArtifactSchema
|
|
4872
|
+
[ARTIFACT_TYPES.IDENTITY]: IdentityArtifactSchema
|
|
4862
4873
|
};
|
|
4863
4874
|
var HARDENED_ARTIFACT_TYPES = /* @__PURE__ */ new Set([
|
|
4864
4875
|
ARTIFACT_TYPES.OFFLINE_PAYMENT_AUTHORIZATION,
|
|
@@ -4871,8 +4882,7 @@ var HARDENED_ARTIFACT_TYPES = /* @__PURE__ */ new Set([
|
|
|
4871
4882
|
ARTIFACT_TYPES.LEDGER_JOURNAL_ENTRY,
|
|
4872
4883
|
ARTIFACT_TYPES.STATEMENT,
|
|
4873
4884
|
ARTIFACT_TYPES.PASS,
|
|
4874
|
-
ARTIFACT_TYPES.IDENTITY
|
|
4875
|
-
ARTIFACT_TYPES.PAY_CARD
|
|
4885
|
+
ARTIFACT_TYPES.IDENTITY
|
|
4876
4886
|
]);
|
|
4877
4887
|
function isKnownArtifactType(t) {
|
|
4878
4888
|
return Object.values(ARTIFACT_TYPES).includes(t);
|
|
@@ -4957,130 +4967,6 @@ function createOfflinePaymentAuthorizationArtifactUri(input) {
|
|
|
4957
4967
|
type: ARTIFACT_TYPES.OFFLINE_PAYMENT_AUTHORIZATION
|
|
4958
4968
|
});
|
|
4959
4969
|
}
|
|
4960
|
-
|
|
4961
|
-
// src/artifacts/paycard.ts
|
|
4962
|
-
var PAY_CARD_DEFAULT_TTL_MS = 90 * 24 * 60 * 60 * 1e3;
|
|
4963
|
-
var PAY_CARD_REFRESH_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
4964
|
-
var PAY_CARD_URI_PREFIX = `${FLUR_ARTIFACT_URI_PREFIX}${ARTIFACT_TYPES.PAY_CARD}/`;
|
|
4965
|
-
function createPayCardArtifactUri(input) {
|
|
4966
|
-
if (input.data.userId !== input.issuer) {
|
|
4967
|
-
throw new FlurArtifactError(
|
|
4968
|
-
"pay_card.data.userId must equal envelope issuer",
|
|
4969
|
-
"INVALID_BODY"
|
|
4970
|
-
);
|
|
4971
|
-
}
|
|
4972
|
-
const iat = input.issuedAtSeconds ?? Math.floor(Date.now() / 1e3);
|
|
4973
|
-
const exp = input.expiresAtSeconds ?? iat + Math.floor(PAY_CARD_DEFAULT_TTL_MS / 1e3);
|
|
4974
|
-
return createArtifactUri({
|
|
4975
|
-
type: ARTIFACT_TYPES.PAY_CARD,
|
|
4976
|
-
issuer: input.issuer,
|
|
4977
|
-
keyId: input.keyId,
|
|
4978
|
-
privateKey: input.privateKey,
|
|
4979
|
-
nonce: input.nonce,
|
|
4980
|
-
issuedAtSeconds: iat,
|
|
4981
|
-
expiresAtSeconds: exp,
|
|
4982
|
-
data: input.data
|
|
4983
|
-
});
|
|
4984
|
-
}
|
|
4985
|
-
function isPayCardArtifactUri(uri) {
|
|
4986
|
-
return typeof uri === "string" && uri.startsWith(PAY_CARD_URI_PREFIX);
|
|
4987
|
-
}
|
|
4988
|
-
function decodePayCardArtifact(uri) {
|
|
4989
|
-
if (!isPayCardArtifactUri(uri)) {
|
|
4990
|
-
throw new FlurArtifactError(
|
|
4991
|
-
`URI does not start with ${PAY_CARD_URI_PREFIX}`,
|
|
4992
|
-
"INVALID_URI"
|
|
4993
|
-
);
|
|
4994
|
-
}
|
|
4995
|
-
const decoded = decodeArtifactUri(uri);
|
|
4996
|
-
if (decoded.type !== ARTIFACT_TYPES.PAY_CARD) {
|
|
4997
|
-
throw new FlurArtifactError(
|
|
4998
|
-
`Expected pay_card, got ${decoded.type}`,
|
|
4999
|
-
"TYPE_MISMATCH"
|
|
5000
|
-
);
|
|
5001
|
-
}
|
|
5002
|
-
const parsed = PayCardArtifactSchema.safeParse(decoded.body.data);
|
|
5003
|
-
if (!parsed.success) {
|
|
5004
|
-
throw new FlurArtifactError(
|
|
5005
|
-
`pay_card body invalid: ${parsed.error.message}`,
|
|
5006
|
-
"INVALID_BODY"
|
|
5007
|
-
);
|
|
5008
|
-
}
|
|
5009
|
-
if (parsed.data.userId !== decoded.body.iss) {
|
|
5010
|
-
throw new FlurArtifactError(
|
|
5011
|
-
"pay_card.data.userId must equal envelope issuer",
|
|
5012
|
-
"INVALID_BODY"
|
|
5013
|
-
);
|
|
5014
|
-
}
|
|
5015
|
-
return {
|
|
5016
|
-
body: {
|
|
5017
|
-
...decoded.body,
|
|
5018
|
-
data: parsed.data
|
|
5019
|
-
},
|
|
5020
|
-
sig: decoded.sig,
|
|
5021
|
-
decoded
|
|
5022
|
-
};
|
|
5023
|
-
}
|
|
5024
|
-
function verifyPayCardArtifact(uri, publicKeySpkiB64, options = {}) {
|
|
5025
|
-
if (!isPayCardArtifactUri(uri)) {
|
|
5026
|
-
throw new FlurArtifactError(
|
|
5027
|
-
`URI does not start with ${PAY_CARD_URI_PREFIX}`,
|
|
5028
|
-
"INVALID_URI"
|
|
5029
|
-
);
|
|
5030
|
-
}
|
|
5031
|
-
const verified = verifyArtifactUri(
|
|
5032
|
-
uri,
|
|
5033
|
-
publicKeySpkiB64,
|
|
5034
|
-
options
|
|
5035
|
-
);
|
|
5036
|
-
if (verified.decoded.type !== ARTIFACT_TYPES.PAY_CARD) {
|
|
5037
|
-
throw new FlurArtifactError(
|
|
5038
|
-
`Expected pay_card, got ${verified.decoded.type}`,
|
|
5039
|
-
"TYPE_MISMATCH"
|
|
5040
|
-
);
|
|
5041
|
-
}
|
|
5042
|
-
if (verified.body.data.userId !== verified.body.iss) {
|
|
5043
|
-
throw new FlurArtifactError(
|
|
5044
|
-
"pay_card.data.userId must equal envelope issuer",
|
|
5045
|
-
"INVALID_BODY"
|
|
5046
|
-
);
|
|
5047
|
-
}
|
|
5048
|
-
return {
|
|
5049
|
-
body: verified.body,
|
|
5050
|
-
sig: verified.sig,
|
|
5051
|
-
decoded: verified.decoded
|
|
5052
|
-
};
|
|
5053
|
-
}
|
|
5054
|
-
function inspectPayCardFreshness(decoded, nowMs = Date.now()) {
|
|
5055
|
-
const exp = decoded.body.exp;
|
|
5056
|
-
if (exp === void 0) return "no_expiry";
|
|
5057
|
-
const remainingMs = exp * 1e3 - nowMs;
|
|
5058
|
-
if (remainingMs <= 0) return "expired";
|
|
5059
|
-
if (remainingMs <= PAY_CARD_REFRESH_THRESHOLD_MS)
|
|
5060
|
-
return "refresh_recommended";
|
|
5061
|
-
return "fresh";
|
|
5062
|
-
}
|
|
5063
|
-
function buildPayCardSigningInput(input) {
|
|
5064
|
-
if (input.data.userId !== input.issuer) {
|
|
5065
|
-
throw new FlurArtifactError(
|
|
5066
|
-
"pay_card.data.userId must equal envelope issuer",
|
|
5067
|
-
"INVALID_BODY"
|
|
5068
|
-
);
|
|
5069
|
-
}
|
|
5070
|
-
const parsedData = PayCardArtifactSchema.parse(input.data);
|
|
5071
|
-
const iat = input.issuedAtSeconds ?? Math.floor(Date.now() / 1e3);
|
|
5072
|
-
const exp = input.expiresAtSeconds ?? iat + Math.floor(PAY_CARD_DEFAULT_TTL_MS / 1e3);
|
|
5073
|
-
const body = buildArtifactBody({
|
|
5074
|
-
type: ARTIFACT_TYPES.PAY_CARD,
|
|
5075
|
-
issuer: input.issuer,
|
|
5076
|
-
keyId: input.keyId,
|
|
5077
|
-
data: parsedData,
|
|
5078
|
-
nonce: input.nonce,
|
|
5079
|
-
issuedAtSeconds: iat,
|
|
5080
|
-
expiresAtSeconds: exp
|
|
5081
|
-
});
|
|
5082
|
-
return { body, bodyBytes: canonicalJSONBytes(body) };
|
|
5083
|
-
}
|
|
5084
4970
|
// Annotate the CommonJS export names for ESM import in node:
|
|
5085
4971
|
0 && (module.exports = {
|
|
5086
4972
|
ACCOUNT_FUNDED_OAC_MAX_TTL_MS,
|
|
@@ -5162,6 +5048,7 @@ function buildPayCardSigningInput(input) {
|
|
|
5162
5048
|
OFFLINE_SMS_SETTLE_SIGNATURE_BYTES,
|
|
5163
5049
|
OFFLINE_SMS_SETTLE_TOKEN_BYTES,
|
|
5164
5050
|
OFFLINE_SMS_SETTLE_VERSION,
|
|
5051
|
+
OacPresentmentRequestSchema,
|
|
5165
5052
|
OfflineClaimArtifactSchema,
|
|
5166
5053
|
OfflinePaymentAuthorizationArtifactSchema,
|
|
5167
5054
|
OfflinePaymentAuthorizationSchema,
|
|
@@ -5179,9 +5066,6 @@ function buildPayCardSigningInput(input) {
|
|
|
5179
5066
|
PASS_STATES,
|
|
5180
5067
|
PAYLOAD_FORMAT_INDICATOR_VALUE,
|
|
5181
5068
|
PAYOUT_DESTINATION_STATUSES,
|
|
5182
|
-
PAY_CARD_DEFAULT_TTL_MS,
|
|
5183
|
-
PAY_CARD_REFRESH_THRESHOLD_MS,
|
|
5184
|
-
PAY_CARD_URI_PREFIX,
|
|
5185
5069
|
POINT_OF_INITIATION,
|
|
5186
5070
|
PartnerFundingEventInputSchema,
|
|
5187
5071
|
PartnerFundingSchema,
|
|
@@ -5189,7 +5073,6 @@ function buildPayCardSigningInput(input) {
|
|
|
5189
5073
|
PassArtifactSchema,
|
|
5190
5074
|
PassMetadataSchema,
|
|
5191
5075
|
PassSchema,
|
|
5192
|
-
PayCardArtifactSchema,
|
|
5193
5076
|
PayCollectionInputSchema,
|
|
5194
5077
|
PaymentClaimSchema,
|
|
5195
5078
|
PaymentIntentArtifactSchema,
|
|
@@ -5228,7 +5111,6 @@ function buildPayCardSigningInput(input) {
|
|
|
5228
5111
|
buildConsumerPaymentRequest,
|
|
5229
5112
|
buildOAC,
|
|
5230
5113
|
buildPass,
|
|
5231
|
-
buildPayCardSigningInput,
|
|
5232
5114
|
buildPaymentRequest,
|
|
5233
5115
|
buildReceipt,
|
|
5234
5116
|
buildRedemption,
|
|
@@ -5263,17 +5145,16 @@ function buildPayCardSigningInput(input) {
|
|
|
5263
5145
|
createPartnerFundingClient,
|
|
5264
5146
|
createPartnerProfileAdminClient,
|
|
5265
5147
|
createPassesClient,
|
|
5266
|
-
createPayCardArtifactUri,
|
|
5267
5148
|
createReceiptArtifactUri,
|
|
5268
5149
|
createReceiptsClient,
|
|
5269
5150
|
createSoftwareP256Signer,
|
|
5270
5151
|
decodeArtifactUri,
|
|
5271
5152
|
decodeAuthorizationQR,
|
|
5272
5153
|
decodeBase45,
|
|
5154
|
+
decodeConsumerOacRequest,
|
|
5273
5155
|
decodeConsumerSettlementReceiptQR,
|
|
5274
5156
|
decodeOfflineClaimSmsMessage,
|
|
5275
5157
|
decodeOfflineSmsSettleToken,
|
|
5276
|
-
decodePayCardArtifact,
|
|
5277
5158
|
decodePaymentRequestQR,
|
|
5278
5159
|
decodeUnverifiedConsumerOacQR,
|
|
5279
5160
|
decodeUnverifiedConsumerSettlementReceiptQR,
|
|
@@ -5293,13 +5174,11 @@ function buildPayCardSigningInput(input) {
|
|
|
5293
5174
|
generateDynamicQR,
|
|
5294
5175
|
generateStaticQR,
|
|
5295
5176
|
init,
|
|
5296
|
-
inspectPayCardFreshness,
|
|
5297
5177
|
isConsumerOacQR,
|
|
5298
5178
|
isConsumerPaymentRequestExpired,
|
|
5299
5179
|
isHardenedArtifactType,
|
|
5300
5180
|
isKnownArtifactType,
|
|
5301
5181
|
isPassWithinValidity,
|
|
5302
|
-
isPayCardArtifactUri,
|
|
5303
5182
|
moneyMinorToNumber,
|
|
5304
5183
|
normalizeE164,
|
|
5305
5184
|
parseAmountInput,
|
|
@@ -5328,7 +5207,6 @@ function buildPayCardSigningInput(input) {
|
|
|
5328
5207
|
verifyOacOffline,
|
|
5329
5208
|
verifyOfflineSmsSettleToken,
|
|
5330
5209
|
verifyPass,
|
|
5331
|
-
verifyPayCardArtifact,
|
|
5332
5210
|
verifyPaymentRequest,
|
|
5333
5211
|
verifyReceipt,
|
|
5334
5212
|
verifyRedemption,
|