@brninpay/core 0.1.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/.turbo/turbo-build.log +4 -0
- package/LICENSE +203 -0
- package/README.md +7 -0
- package/dist/decision-resolver.d.ts +5 -0
- package/dist/decision-resolver.d.ts.map +1 -0
- package/dist/decision-resolver.js +20 -0
- package/dist/decision-resolver.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/policies/allowlist.d.ts +3 -0
- package/dist/policies/allowlist.d.ts.map +1 -0
- package/dist/policies/allowlist.js +21 -0
- package/dist/policies/allowlist.js.map +1 -0
- package/dist/policies/budget-check.d.ts +3 -0
- package/dist/policies/budget-check.d.ts.map +1 -0
- package/dist/policies/budget-check.js +22 -0
- package/dist/policies/budget-check.js.map +1 -0
- package/dist/policies/index.d.ts +5 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +5 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/max-per-call.d.ts +3 -0
- package/dist/policies/max-per-call.d.ts.map +1 -0
- package/dist/policies/max-per-call.js +20 -0
- package/dist/policies/max-per-call.js.map +1 -0
- package/dist/policies/rate-limit.d.ts +3 -0
- package/dist/policies/rate-limit.d.ts.map +1 -0
- package/dist/policies/rate-limit.js +33 -0
- package/dist/policies/rate-limit.js.map +1 -0
- package/dist/policy-engine.d.ts +8 -0
- package/dist/policy-engine.d.ts.map +1 -0
- package/dist/policy-engine.js +39 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/types/errors.d.ts +80 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +150 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/payment.d.ts +55 -0
- package/dist/types/payment.d.ts.map +1 -0
- package/dist/types/payment.js +188 -0
- package/dist/types/payment.js.map +1 -0
- package/dist/types/policy.d.ts +58 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +194 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/types/wallet.d.ts +66 -0
- package/dist/types/wallet.d.ts.map +1 -0
- package/dist/types/wallet.js +13 -0
- package/dist/types/wallet.js.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crypto.d.ts +25 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +119 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/validation/schemas.d.ts +598 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +178 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +30 -0
- package/src/decision-resolver.ts +16 -0
- package/src/errors.ts +20 -0
- package/src/index.ts +139 -0
- package/src/policies/allowlist.ts +26 -0
- package/src/policies/budget-check.ts +26 -0
- package/src/policies/index.ts +4 -0
- package/src/policies/max-per-call.ts +25 -0
- package/src/policies/rate-limit.ts +40 -0
- package/src/policy-engine.ts +65 -0
- package/src/types/errors.ts +215 -0
- package/src/types/payment.ts +297 -0
- package/src/types/policy.ts +289 -0
- package/src/types/wallet.ts +84 -0
- package/src/types.ts +193 -0
- package/src/utils/crypto.ts +182 -0
- package/src/validation/schemas.ts +208 -0
- package/test/architecture/architecture-invariants.test.ts +95 -0
- package/test/authorization-pipeline.test.ts +117 -0
- package/test/crypto.test.ts +56 -0
- package/test/decision-resolver.test.ts +52 -0
- package/test/errors.test.ts +97 -0
- package/test/payment-types.test.ts +49 -0
- package/test/policies.test.ts +162 -0
- package/test/policy-engine.test.ts +96 -0
- package/test/policy-types.test.ts +93 -0
- package/test/property/auth-invariants.test.ts +110 -0
- package/test/property/policy-invariants.test.ts +241 -0
- package/test/schemas.test.ts +58 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export var ErrorCode;
|
|
2
|
+
(function (ErrorCode) {
|
|
3
|
+
ErrorCode["VALIDATION_ERROR"] = "validation_error";
|
|
4
|
+
ErrorCode["AUTHORIZATION_ERROR"] = "authorization_error";
|
|
5
|
+
ErrorCode["BUDGET_EXHAUSTED"] = "budget_exhausted";
|
|
6
|
+
ErrorCode["ALLOWLIST_DENIED"] = "allowlist_denied";
|
|
7
|
+
ErrorCode["RATE_LIMIT_EXCEEDED"] = "rate_limit_exceeded";
|
|
8
|
+
ErrorCode["AUTHORIZATION_EXPIRED"] = "authorization_expired";
|
|
9
|
+
ErrorCode["EXECUTION_ERROR"] = "execution_error";
|
|
10
|
+
ErrorCode["NETWORK_ERROR"] = "network_error";
|
|
11
|
+
ErrorCode["GAS_ESTIMATION_ERROR"] = "gas_estimation_error";
|
|
12
|
+
ErrorCode["BROADCAST_ERROR"] = "broadcast_error";
|
|
13
|
+
ErrorCode["REORG_DETECTED"] = "reorg_detected";
|
|
14
|
+
ErrorCode["HMAC_VERIFICATION_FAILED"] = "hmac_verification_failed";
|
|
15
|
+
})(ErrorCode || (ErrorCode = {}));
|
|
16
|
+
export class RuntimeeError extends Error {
|
|
17
|
+
code;
|
|
18
|
+
statusCode;
|
|
19
|
+
details;
|
|
20
|
+
constructor(code, message, statusCode = 500, details, options) {
|
|
21
|
+
super(message, options);
|
|
22
|
+
this.name = new.target.name;
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.statusCode = statusCode;
|
|
25
|
+
this.details = details;
|
|
26
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
27
|
+
}
|
|
28
|
+
toJSON() {
|
|
29
|
+
return serializeError(this);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class ValidationError extends RuntimeeError {
|
|
33
|
+
constructor(message, details, options) {
|
|
34
|
+
super(ErrorCode.VALIDATION_ERROR, message, 400, details, options);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class AuthorizationError extends RuntimeeError {
|
|
38
|
+
constructor(code, message, details, options) {
|
|
39
|
+
super(code, message, 403, details, options);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class BudgetExhaustedError extends AuthorizationError {
|
|
43
|
+
policyId;
|
|
44
|
+
budgetUsed;
|
|
45
|
+
budgetLimit;
|
|
46
|
+
constructor(policyId, used, limit, options) {
|
|
47
|
+
super(ErrorCode.BUDGET_EXHAUSTED, `Budget exhausted: ${used} used of ${limit} limit`, {
|
|
48
|
+
policyId,
|
|
49
|
+
budgetUsed: used.toString(),
|
|
50
|
+
budgetLimit: limit.toString(),
|
|
51
|
+
}, options);
|
|
52
|
+
this.policyId = policyId;
|
|
53
|
+
this.budgetUsed = used;
|
|
54
|
+
this.budgetLimit = limit;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class AllowlistDeniedError extends AuthorizationError {
|
|
58
|
+
policyId;
|
|
59
|
+
target;
|
|
60
|
+
constructor(policyId, target, options) {
|
|
61
|
+
super(ErrorCode.ALLOWLIST_DENIED, `Target "${target}" not in allowlist`, {
|
|
62
|
+
policyId,
|
|
63
|
+
target,
|
|
64
|
+
}, options);
|
|
65
|
+
this.policyId = policyId;
|
|
66
|
+
this.target = target;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export class RateLimitExceededError extends AuthorizationError {
|
|
70
|
+
policyId;
|
|
71
|
+
windowMs;
|
|
72
|
+
maxCalls;
|
|
73
|
+
constructor(policyId, windowMs, maxCalls, options) {
|
|
74
|
+
super(ErrorCode.RATE_LIMIT_EXCEEDED, `Rate limit exceeded: max ${maxCalls} calls per ${windowMs}ms window`, {
|
|
75
|
+
policyId,
|
|
76
|
+
windowMs,
|
|
77
|
+
maxCalls,
|
|
78
|
+
}, options);
|
|
79
|
+
this.policyId = policyId;
|
|
80
|
+
this.windowMs = windowMs;
|
|
81
|
+
this.maxCalls = maxCalls;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export class AuthorizationExpiredError extends AuthorizationError {
|
|
85
|
+
constructor(options) {
|
|
86
|
+
super(ErrorCode.AUTHORIZATION_EXPIRED, 'Authorization preview has expired. Re-simulate.', undefined, options);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export class ExecutionError extends RuntimeeError {
|
|
90
|
+
constructor(code, message, details, options) {
|
|
91
|
+
super(code, message, 502, details, options);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export class NetworkError extends ExecutionError {
|
|
95
|
+
constructor(message, details, options) {
|
|
96
|
+
super(ErrorCode.NETWORK_ERROR, message, details, options);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export class GasEstimationError extends ExecutionError {
|
|
100
|
+
constructor(message, details, options) {
|
|
101
|
+
super(ErrorCode.GAS_ESTIMATION_ERROR, message, details, options);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export class BroadcastError extends ExecutionError {
|
|
105
|
+
constructor(message, details, options) {
|
|
106
|
+
super(ErrorCode.BROADCAST_ERROR, message, details, options);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export class ReorgDetectedError extends ExecutionError {
|
|
110
|
+
depth;
|
|
111
|
+
constructor(depth, options) {
|
|
112
|
+
super(ErrorCode.REORG_DETECTED, `Chain reorg detected at depth ${depth}`, { depth }, options);
|
|
113
|
+
this.depth = depth;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export class HmacVerificationError extends RuntimeeError {
|
|
117
|
+
constructor(message, details, options) {
|
|
118
|
+
super(ErrorCode.HMAC_VERIFICATION_FAILED, message, 401, details, options);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function isRuntimeeError(error) {
|
|
122
|
+
return error instanceof RuntimeeError;
|
|
123
|
+
}
|
|
124
|
+
export function serializeError(error) {
|
|
125
|
+
if (error instanceof RuntimeeError) {
|
|
126
|
+
return {
|
|
127
|
+
name: error.name,
|
|
128
|
+
code: error.code,
|
|
129
|
+
message: error.message,
|
|
130
|
+
statusCode: error.statusCode,
|
|
131
|
+
details: error.details,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (error instanceof Error) {
|
|
135
|
+
return {
|
|
136
|
+
name: error.name,
|
|
137
|
+
code: ErrorCode.EXECUTION_ERROR,
|
|
138
|
+
message: error.message,
|
|
139
|
+
statusCode: 500,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
name: 'UnknownError',
|
|
144
|
+
code: ErrorCode.EXECUTION_ERROR,
|
|
145
|
+
message: 'Unknown error',
|
|
146
|
+
statusCode: 500,
|
|
147
|
+
details: error,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Address } from './wallet.js';
|
|
2
|
+
export declare const PAYMENT_INTENT_STATUSES: readonly ["draft", "pending_policy", "pending_approval", "approved", "rejected", "pending_submission", "submitted", "confirming", "succeeded", "failed", "cancelled", "expired"];
|
|
3
|
+
export type PaymentIntentStatus = (typeof PAYMENT_INTENT_STATUSES)[number];
|
|
4
|
+
export interface PaymentAmount {
|
|
5
|
+
currency: 'USDC';
|
|
6
|
+
value: bigint;
|
|
7
|
+
decimals: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PaymentRecipient {
|
|
10
|
+
address: Address;
|
|
11
|
+
chainId: number;
|
|
12
|
+
ensName?: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface PaymentIntentFailure {
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
retryable: boolean;
|
|
18
|
+
detail?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export type PaymentMetadataValue = string | number | boolean | null | PaymentMetadataValue[] | {
|
|
21
|
+
[key: string]: PaymentMetadataValue;
|
|
22
|
+
};
|
|
23
|
+
export interface PaymentIntent {
|
|
24
|
+
id: string;
|
|
25
|
+
workspaceId: string;
|
|
26
|
+
actorId: string;
|
|
27
|
+
status: PaymentIntentStatus;
|
|
28
|
+
amount: PaymentAmount;
|
|
29
|
+
recipient: PaymentRecipient;
|
|
30
|
+
createdAt: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
expiresAt?: string | null;
|
|
33
|
+
idempotencyKey?: string | null;
|
|
34
|
+
description?: string | null;
|
|
35
|
+
reference?: string | null;
|
|
36
|
+
transactionHash?: `0x${string}` | null;
|
|
37
|
+
failure?: PaymentIntentFailure | null;
|
|
38
|
+
metadata?: Record<string, PaymentMetadataValue>;
|
|
39
|
+
}
|
|
40
|
+
export interface SerializedBigInt {
|
|
41
|
+
__type: 'bigint';
|
|
42
|
+
value: string;
|
|
43
|
+
}
|
|
44
|
+
export declare const PAYMENT_INTENT_TERMINAL_STATUSES: Set<"draft" | "pending_policy" | "pending_approval" | "approved" | "rejected" | "pending_submission" | "submitted" | "confirming" | "succeeded" | "failed" | "cancelled" | "expired">;
|
|
45
|
+
export declare const PAYMENT_INTENT_TRANSITIONS: Record<PaymentIntentStatus, readonly PaymentIntentStatus[]>;
|
|
46
|
+
export declare function validatePaymentAmount(amount: PaymentAmount): void;
|
|
47
|
+
export declare function isPaymentIntentTerminalStatus(status: PaymentIntentStatus): boolean;
|
|
48
|
+
export declare function canTransitionPaymentIntentStatus(currentStatus: PaymentIntentStatus, nextStatus: PaymentIntentStatus): boolean;
|
|
49
|
+
export declare function assertValidPaymentIntentTransition(currentStatus: PaymentIntentStatus, nextStatus: PaymentIntentStatus): void;
|
|
50
|
+
export declare function assertPaymentIntent(value: unknown): asserts value is PaymentIntent;
|
|
51
|
+
export declare function serializeBigInts(value: unknown): unknown;
|
|
52
|
+
export declare function deserializeBigInts<T>(value: unknown): T;
|
|
53
|
+
export declare function serializePaymentIntent(paymentIntent: PaymentIntent): string;
|
|
54
|
+
export declare function deserializePaymentIntent(payload: string | unknown): PaymentIntent;
|
|
55
|
+
//# sourceMappingURL=payment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../src/types/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { ValidationError } from './errors.js';
|
|
2
|
+
export const PAYMENT_INTENT_STATUSES = [
|
|
3
|
+
'draft',
|
|
4
|
+
'pending_policy',
|
|
5
|
+
'pending_approval',
|
|
6
|
+
'approved',
|
|
7
|
+
'rejected',
|
|
8
|
+
'pending_submission',
|
|
9
|
+
'submitted',
|
|
10
|
+
'confirming',
|
|
11
|
+
'succeeded',
|
|
12
|
+
'failed',
|
|
13
|
+
'cancelled',
|
|
14
|
+
'expired',
|
|
15
|
+
];
|
|
16
|
+
export const PAYMENT_INTENT_TERMINAL_STATUSES = new Set([
|
|
17
|
+
'rejected',
|
|
18
|
+
'succeeded',
|
|
19
|
+
'failed',
|
|
20
|
+
'cancelled',
|
|
21
|
+
'expired',
|
|
22
|
+
]);
|
|
23
|
+
export const PAYMENT_INTENT_TRANSITIONS = {
|
|
24
|
+
draft: ['pending_policy', 'cancelled', 'expired'],
|
|
25
|
+
pending_policy: ['pending_approval', 'approved', 'rejected', 'cancelled', 'expired'],
|
|
26
|
+
pending_approval: ['approved', 'rejected', 'cancelled', 'expired'],
|
|
27
|
+
approved: ['pending_submission', 'submitted', 'cancelled', 'expired'],
|
|
28
|
+
rejected: [],
|
|
29
|
+
pending_submission: ['submitted', 'failed', 'cancelled', 'expired'],
|
|
30
|
+
submitted: ['confirming', 'succeeded', 'failed'],
|
|
31
|
+
confirming: ['succeeded', 'failed'],
|
|
32
|
+
succeeded: [],
|
|
33
|
+
failed: [],
|
|
34
|
+
cancelled: [],
|
|
35
|
+
expired: [],
|
|
36
|
+
};
|
|
37
|
+
function isObject(value) {
|
|
38
|
+
return typeof value === 'object' && value !== null;
|
|
39
|
+
}
|
|
40
|
+
function assertIsoTimestamp(value, fieldName) {
|
|
41
|
+
if (Number.isNaN(Date.parse(value))) {
|
|
42
|
+
throw new ValidationError(`${fieldName} must be a valid ISO-8601 timestamp`, {
|
|
43
|
+
field: fieldName,
|
|
44
|
+
value,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function validatePaymentAmount(amount) {
|
|
49
|
+
if (amount.currency !== 'USDC') {
|
|
50
|
+
throw new ValidationError('Payment amount currency must be USDC', {
|
|
51
|
+
field: 'amount.currency',
|
|
52
|
+
value: amount.currency,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (amount.value <= 0n) {
|
|
56
|
+
throw new ValidationError('Payment amount must be greater than zero', {
|
|
57
|
+
field: 'amount.value',
|
|
58
|
+
value: amount.value.toString(),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (!Number.isInteger(amount.decimals) || amount.decimals < 0 || amount.decimals > 18) {
|
|
62
|
+
throw new ValidationError('Payment amount decimals must be an integer between 0 and 18', {
|
|
63
|
+
field: 'amount.decimals',
|
|
64
|
+
value: amount.decimals,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function isPaymentIntentTerminalStatus(status) {
|
|
69
|
+
return PAYMENT_INTENT_TERMINAL_STATUSES.has(status);
|
|
70
|
+
}
|
|
71
|
+
export function canTransitionPaymentIntentStatus(currentStatus, nextStatus) {
|
|
72
|
+
return PAYMENT_INTENT_TRANSITIONS[currentStatus].includes(nextStatus);
|
|
73
|
+
}
|
|
74
|
+
export function assertValidPaymentIntentTransition(currentStatus, nextStatus) {
|
|
75
|
+
if (!canTransitionPaymentIntentStatus(currentStatus, nextStatus)) {
|
|
76
|
+
throw new ValidationError(`Invalid payment intent transition from ${currentStatus} to ${nextStatus}`, {
|
|
77
|
+
currentStatus,
|
|
78
|
+
nextStatus,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function assertPaymentIntent(value) {
|
|
83
|
+
if (!isObject(value)) {
|
|
84
|
+
throw new ValidationError('Payment intent payload must be an object');
|
|
85
|
+
}
|
|
86
|
+
if (typeof value.id !== 'string' || !value.id.trim()) {
|
|
87
|
+
throw new ValidationError('Payment intent id is required', { field: 'id' });
|
|
88
|
+
}
|
|
89
|
+
if (typeof value.workspaceId !== 'string' || !value.workspaceId.trim()) {
|
|
90
|
+
throw new ValidationError('Payment intent workspaceId is required', {
|
|
91
|
+
field: 'workspaceId',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (typeof value.actorId !== 'string' || !value.actorId.trim()) {
|
|
95
|
+
throw new ValidationError('Payment intent actorId is required', {
|
|
96
|
+
field: 'actorId',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (typeof value.status !== 'string' ||
|
|
100
|
+
!PAYMENT_INTENT_STATUSES.includes(value.status)) {
|
|
101
|
+
throw new ValidationError('Payment intent status is invalid', {
|
|
102
|
+
field: 'status',
|
|
103
|
+
value: value.status,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (!isObject(value.amount)) {
|
|
107
|
+
throw new ValidationError('Payment intent amount is required', { field: 'amount' });
|
|
108
|
+
}
|
|
109
|
+
if (!isObject(value.recipient)) {
|
|
110
|
+
throw new ValidationError('Payment intent recipient is required', {
|
|
111
|
+
field: 'recipient',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (typeof value.recipient.address !== 'string' || !value.recipient.address.startsWith('0x')) {
|
|
115
|
+
throw new ValidationError('Payment intent recipient address is invalid', {
|
|
116
|
+
field: 'recipient.address',
|
|
117
|
+
value: value.recipient.address,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (typeof value.recipient.chainId !== 'number' ||
|
|
121
|
+
!Number.isInteger(value.recipient.chainId) ||
|
|
122
|
+
value.recipient.chainId <= 0) {
|
|
123
|
+
throw new ValidationError('Payment intent recipient chainId is invalid', {
|
|
124
|
+
field: 'recipient.chainId',
|
|
125
|
+
value: value.recipient.chainId,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
validatePaymentAmount(value.amount);
|
|
129
|
+
if (typeof value.createdAt !== 'string') {
|
|
130
|
+
throw new ValidationError('Payment intent createdAt is required', {
|
|
131
|
+
field: 'createdAt',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (typeof value.updatedAt !== 'string') {
|
|
135
|
+
throw new ValidationError('Payment intent updatedAt is required', {
|
|
136
|
+
field: 'updatedAt',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
assertIsoTimestamp(value.createdAt, 'createdAt');
|
|
140
|
+
assertIsoTimestamp(value.updatedAt, 'updatedAt');
|
|
141
|
+
if (value.expiresAt !== undefined && value.expiresAt !== null && typeof value.expiresAt !== 'string') {
|
|
142
|
+
throw new ValidationError('Payment intent expiresAt must be a timestamp string', {
|
|
143
|
+
field: 'expiresAt',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (value.expiresAt) {
|
|
147
|
+
assertIsoTimestamp(value.expiresAt, 'expiresAt');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function serializeBigInts(value) {
|
|
151
|
+
if (typeof value === 'bigint') {
|
|
152
|
+
return {
|
|
153
|
+
__type: 'bigint',
|
|
154
|
+
value: value.toString(),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
return value.map((entry) => serializeBigInts(entry));
|
|
159
|
+
}
|
|
160
|
+
if (isObject(value)) {
|
|
161
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, serializeBigInts(entry)]));
|
|
162
|
+
}
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
export function deserializeBigInts(value) {
|
|
166
|
+
if (Array.isArray(value)) {
|
|
167
|
+
return value.map((entry) => deserializeBigInts(entry));
|
|
168
|
+
}
|
|
169
|
+
if (isObject(value)) {
|
|
170
|
+
if (value.__type === 'bigint' && typeof value.value === 'string') {
|
|
171
|
+
return BigInt(value.value);
|
|
172
|
+
}
|
|
173
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, deserializeBigInts(entry)]));
|
|
174
|
+
}
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
export function serializePaymentIntent(paymentIntent) {
|
|
178
|
+
assertPaymentIntent(paymentIntent);
|
|
179
|
+
// Preserve bigint fidelity over JSON transport without leaking decimal precision.
|
|
180
|
+
return JSON.stringify(serializeBigInts(paymentIntent));
|
|
181
|
+
}
|
|
182
|
+
export function deserializePaymentIntent(payload) {
|
|
183
|
+
const candidate = typeof payload === 'string' ? JSON.parse(payload) : payload;
|
|
184
|
+
const paymentIntent = deserializeBigInts(candidate);
|
|
185
|
+
assertPaymentIntent(paymentIntent);
|
|
186
|
+
return paymentIntent;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=payment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../../src/types/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Address } from './wallet.js';
|
|
2
|
+
export declare const POLICY_DECISIONS: readonly ["allow", "deny", "review"];
|
|
3
|
+
export type PolicyDecision = (typeof POLICY_DECISIONS)[number];
|
|
4
|
+
export interface PolicyReason {
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
detail?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface BasePolicy {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface BudgetPolicy extends BasePolicy {
|
|
15
|
+
kind: 'budget';
|
|
16
|
+
currency: 'USDC';
|
|
17
|
+
limit: bigint;
|
|
18
|
+
softLimit?: bigint;
|
|
19
|
+
}
|
|
20
|
+
export interface AllowlistPolicy extends BasePolicy {
|
|
21
|
+
kind: 'allowlist';
|
|
22
|
+
addresses: readonly Address[];
|
|
23
|
+
chains?: readonly number[];
|
|
24
|
+
}
|
|
25
|
+
export interface RateLimitPolicy extends BasePolicy {
|
|
26
|
+
kind: 'rate_limit';
|
|
27
|
+
maxRequests: number;
|
|
28
|
+
intervalMs: number;
|
|
29
|
+
burst?: number;
|
|
30
|
+
scope: 'actor' | 'workspace' | 'ip';
|
|
31
|
+
}
|
|
32
|
+
export type PolicyDefinition = BudgetPolicy | AllowlistPolicy | RateLimitPolicy;
|
|
33
|
+
export interface PolicyEvaluationContext {
|
|
34
|
+
actorId: string;
|
|
35
|
+
workspaceId: string;
|
|
36
|
+
recipient: Address;
|
|
37
|
+
chainId: number;
|
|
38
|
+
amount: bigint;
|
|
39
|
+
currency: 'USDC';
|
|
40
|
+
timestampMs: number;
|
|
41
|
+
spentAmount: bigint;
|
|
42
|
+
requestCount: number;
|
|
43
|
+
sourceIp?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface PolicyEvaluationResult {
|
|
46
|
+
policyId: string;
|
|
47
|
+
decision: PolicyDecision;
|
|
48
|
+
reason: PolicyReason;
|
|
49
|
+
}
|
|
50
|
+
export interface AggregatedPolicyDecision {
|
|
51
|
+
decision: PolicyDecision;
|
|
52
|
+
reasons: PolicyReason[];
|
|
53
|
+
evaluations: PolicyEvaluationResult[];
|
|
54
|
+
}
|
|
55
|
+
export declare function evaluatePolicy(policy: PolicyDefinition, context: PolicyEvaluationContext): PolicyEvaluationResult;
|
|
56
|
+
export declare function aggregatePolicyDecisions(evaluations: readonly PolicyEvaluationResult[]): AggregatedPolicyDecision;
|
|
57
|
+
export declare function evaluatePolicies(policies: readonly PolicyDefinition[], context: PolicyEvaluationContext): AggregatedPolicyDecision;
|
|
58
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/types/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,gBAAgB,sCAAuC,CAAA;AAEpE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,SAAS,OAAO,EAAE,CAAA;IAC7B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,IAAI,EAAE,YAAY,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAA;CACpC;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,eAAe,GAAG,eAAe,CAAA;AAE/E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,WAAW,EAAE,sBAAsB,EAAE,CAAA;CACtC;AAgBD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,uBAAuB,GAC/B,sBAAsB,CAmKxB;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,SAAS,sBAAsB,EAAE,GAC7C,wBAAwB,CA4B1B;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,OAAO,EAAE,uBAAuB,GAC/B,wBAAwB,CAI1B"}
|