phygital-payment-sdk 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/README.md +120 -0
- package/dist/arbiter/client.d.ts +34 -0
- package/dist/arbiter/client.d.ts.map +1 -0
- package/dist/arbiter/client.js +106 -0
- package/dist/arbiter/client.js.map +1 -0
- package/dist/core/amounts.d.ts +4 -0
- package/dist/core/amounts.d.ts.map +1 -0
- package/dist/core/amounts.js +36 -0
- package/dist/core/amounts.js.map +1 -0
- package/dist/core/bytes.d.ts +11 -0
- package/dist/core/bytes.d.ts.map +1 -0
- package/dist/core/bytes.js +69 -0
- package/dist/core/bytes.js.map +1 -0
- package/dist/core/challenge.d.ts +15 -0
- package/dist/core/challenge.d.ts.map +1 -0
- package/dist/core/challenge.js +24 -0
- package/dist/core/challenge.js.map +1 -0
- package/dist/core/errors.d.ts +90 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +204 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +113 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +258 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/evidence.d.ts +3 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +7 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/execution-plan.d.ts +25 -0
- package/dist/core/execution-plan.d.ts.map +1 -0
- package/dist/core/execution-plan.js +57 -0
- package/dist/core/execution-plan.js.map +1 -0
- package/dist/core/indexer-store.d.ts +31 -0
- package/dist/core/indexer-store.d.ts.map +1 -0
- package/dist/core/indexer-store.js +2 -0
- package/dist/core/indexer-store.js.map +1 -0
- package/dist/core/instruction-codec.d.ts +13 -0
- package/dist/core/instruction-codec.d.ts.map +1 -0
- package/dist/core/instruction-codec.js +23 -0
- package/dist/core/instruction-codec.js.map +1 -0
- package/dist/core/payment.d.ts +116 -0
- package/dist/core/payment.d.ts.map +1 -0
- package/dist/core/payment.js +185 -0
- package/dist/core/payment.js.map +1 -0
- package/dist/core/pda.d.ts +29 -0
- package/dist/core/pda.d.ts.map +1 -0
- package/dist/core/pda.js +48 -0
- package/dist/core/pda.js.map +1 -0
- package/dist/core/provider-fee-payer.d.ts +5 -0
- package/dist/core/provider-fee-payer.d.ts.map +1 -0
- package/dist/core/provider-fee-payer.js +17 -0
- package/dist/core/provider-fee-payer.js.map +1 -0
- package/dist/core/provider-transport.d.ts +79 -0
- package/dist/core/provider-transport.d.ts.map +1 -0
- package/dist/core/provider-transport.js +151 -0
- package/dist/core/provider-transport.js.map +1 -0
- package/dist/core/status.d.ts +13 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +17 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/time.d.ts +29 -0
- package/dist/core/time.d.ts.map +1 -0
- package/dist/core/time.js +66 -0
- package/dist/core/time.js.map +1 -0
- package/dist/core/transactions.d.ts +16 -0
- package/dist/core/transactions.d.ts.map +1 -0
- package/dist/core/transactions.js +87 -0
- package/dist/core/transactions.js.map +1 -0
- package/dist/generated/accounts/arbiter.d.ts +31 -0
- package/dist/generated/accounts/arbiter.d.ts.map +1 -0
- package/dist/generated/accounts/arbiter.js +57 -0
- package/dist/generated/accounts/arbiter.js.map +1 -0
- package/dist/generated/accounts/index.d.ts +5 -0
- package/dist/generated/accounts/index.d.ts.map +1 -0
- package/dist/generated/accounts/index.js +5 -0
- package/dist/generated/accounts/index.js.map +1 -0
- package/dist/generated/accounts/merchantOperator.d.ts +25 -0
- package/dist/generated/accounts/merchantOperator.d.ts.map +1 -0
- package/dist/generated/accounts/merchantOperator.js +49 -0
- package/dist/generated/accounts/merchantOperator.js.map +1 -0
- package/dist/generated/accounts/payment.d.ts +56 -0
- package/dist/generated/accounts/payment.d.ts.map +1 -0
- package/dist/generated/accounts/payment.js +82 -0
- package/dist/generated/accounts/payment.js.map +1 -0
- package/dist/generated/accounts/paymentAccount.d.ts +59 -0
- package/dist/generated/accounts/paymentAccount.d.ts.map +1 -0
- package/dist/generated/accounts/paymentAccount.js +83 -0
- package/dist/generated/accounts/paymentAccount.js.map +1 -0
- package/dist/generated/errors/index.d.ts +2 -0
- package/dist/generated/errors/index.d.ts.map +1 -0
- package/dist/generated/errors/index.js +2 -0
- package/dist/generated/errors/index.js.map +1 -0
- package/dist/generated/errors/phygitalPayment.d.ts +50 -0
- package/dist/generated/errors/phygitalPayment.d.ts.map +1 -0
- package/dist/generated/errors/phygitalPayment.js +91 -0
- package/dist/generated/errors/phygitalPayment.js.map +1 -0
- package/dist/generated/index.d.ts +7 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +7 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/instructions/addMerchantOperator.d.ts +49 -0
- package/dist/generated/instructions/addMerchantOperator.d.ts.map +1 -0
- package/dist/generated/instructions/addMerchantOperator.js +110 -0
- package/dist/generated/instructions/addMerchantOperator.js.map +1 -0
- package/dist/generated/instructions/autoRefund.d.ts +48 -0
- package/dist/generated/instructions/autoRefund.d.ts.map +1 -0
- package/dist/generated/instructions/autoRefund.js +91 -0
- package/dist/generated/instructions/autoRefund.js.map +1 -0
- package/dist/generated/instructions/autoSettle.d.ts +45 -0
- package/dist/generated/instructions/autoSettle.d.ts.map +1 -0
- package/dist/generated/instructions/autoSettle.js +82 -0
- package/dist/generated/instructions/autoSettle.js.map +1 -0
- package/dist/generated/instructions/closeExpiredPayment.d.ts +36 -0
- package/dist/generated/instructions/closeExpiredPayment.d.ts.map +1 -0
- package/dist/generated/instructions/closeExpiredPayment.js +64 -0
- package/dist/generated/instructions/closeExpiredPayment.js.map +1 -0
- package/dist/generated/instructions/dispute.d.ts +49 -0
- package/dist/generated/instructions/dispute.d.ts.map +1 -0
- package/dist/generated/instructions/dispute.js +84 -0
- package/dist/generated/instructions/dispute.js.map +1 -0
- package/dist/generated/instructions/disputeAuthorization.d.ts +73 -0
- package/dist/generated/instructions/disputeAuthorization.d.ts.map +1 -0
- package/dist/generated/instructions/disputeAuthorization.js +149 -0
- package/dist/generated/instructions/disputeAuthorization.js.map +1 -0
- package/dist/generated/instructions/index.d.ts +21 -0
- package/dist/generated/instructions/index.d.ts.map +1 -0
- package/dist/generated/instructions/index.js +21 -0
- package/dist/generated/instructions/index.js.map +1 -0
- package/dist/generated/instructions/merchantRefund.d.ts +43 -0
- package/dist/generated/instructions/merchantRefund.d.ts.map +1 -0
- package/dist/generated/instructions/merchantRefund.js +78 -0
- package/dist/generated/instructions/merchantRefund.js.map +1 -0
- package/dist/generated/instructions/merchantRespond.d.ts +43 -0
- package/dist/generated/instructions/merchantRespond.d.ts.map +1 -0
- package/dist/generated/instructions/merchantRespond.js +78 -0
- package/dist/generated/instructions/merchantRespond.js.map +1 -0
- package/dist/generated/instructions/refundSettled.d.ts +52 -0
- package/dist/generated/instructions/refundSettled.d.ts.map +1 -0
- package/dist/generated/instructions/refundSettled.js +88 -0
- package/dist/generated/instructions/refundSettled.js.map +1 -0
- package/dist/generated/instructions/registerArbiter.d.ts +44 -0
- package/dist/generated/instructions/registerArbiter.d.ts.map +1 -0
- package/dist/generated/instructions/registerArbiter.js +94 -0
- package/dist/generated/instructions/registerArbiter.js.map +1 -0
- package/dist/generated/instructions/removeMerchantOperator.d.ts +45 -0
- package/dist/generated/instructions/removeMerchantOperator.d.ts.map +1 -0
- package/dist/generated/instructions/removeMerchantOperator.js +97 -0
- package/dist/generated/instructions/removeMerchantOperator.js.map +1 -0
- package/dist/generated/instructions/resolveDispute.d.ts +55 -0
- package/dist/generated/instructions/resolveDispute.d.ts.map +1 -0
- package/dist/generated/instructions/resolveDispute.js +91 -0
- package/dist/generated/instructions/resolveDispute.js.map +1 -0
- package/dist/generated/instructions/setApprovedArbiter.d.ts +57 -0
- package/dist/generated/instructions/setApprovedArbiter.d.ts.map +1 -0
- package/dist/generated/instructions/setApprovedArbiter.js +121 -0
- package/dist/generated/instructions/setApprovedArbiter.js.map +1 -0
- package/dist/generated/instructions/setAuthorizedCredential.d.ts +64 -0
- package/dist/generated/instructions/setAuthorizedCredential.d.ts.map +1 -0
- package/dist/generated/instructions/setAuthorizedCredential.js +138 -0
- package/dist/generated/instructions/setAuthorizedCredential.js.map +1 -0
- package/dist/generated/instructions/setPaymentEnabler.d.ts +65 -0
- package/dist/generated/instructions/setPaymentEnabler.d.ts.map +1 -0
- package/dist/generated/instructions/setPaymentEnabler.js +136 -0
- package/dist/generated/instructions/setPaymentEnabler.js.map +1 -0
- package/dist/generated/instructions/setReserve.d.ts +53 -0
- package/dist/generated/instructions/setReserve.d.ts.map +1 -0
- package/dist/generated/instructions/setReserve.js +109 -0
- package/dist/generated/instructions/setReserve.js.map +1 -0
- package/dist/generated/instructions/setTapLimit.d.ts +53 -0
- package/dist/generated/instructions/setTapLimit.d.ts.map +1 -0
- package/dist/generated/instructions/setTapLimit.js +109 -0
- package/dist/generated/instructions/setTapLimit.js.map +1 -0
- package/dist/generated/instructions/transfer.d.ts +97 -0
- package/dist/generated/instructions/transfer.d.ts.map +1 -0
- package/dist/generated/instructions/transfer.js +182 -0
- package/dist/generated/instructions/transfer.js.map +1 -0
- package/dist/generated/instructions/withdrawDispute.d.ts +36 -0
- package/dist/generated/instructions/withdrawDispute.d.ts.map +1 -0
- package/dist/generated/instructions/withdrawDispute.js +61 -0
- package/dist/generated/instructions/withdrawDispute.js.map +1 -0
- package/dist/generated/instructions/withdrawFromEscrow.d.ts +61 -0
- package/dist/generated/instructions/withdrawFromEscrow.d.ts.map +1 -0
- package/dist/generated/instructions/withdrawFromEscrow.js +132 -0
- package/dist/generated/instructions/withdrawFromEscrow.js.map +1 -0
- package/dist/generated/pdas/arbiterAccount.d.ts +8 -0
- package/dist/generated/pdas/arbiterAccount.d.ts.map +1 -0
- package/dist/generated/pdas/arbiterAccount.js +12 -0
- package/dist/generated/pdas/arbiterAccount.js.map +1 -0
- package/dist/generated/pdas/index.d.ts +6 -0
- package/dist/generated/pdas/index.d.ts.map +1 -0
- package/dist/generated/pdas/index.js +6 -0
- package/dist/generated/pdas/index.js.map +1 -0
- package/dist/generated/pdas/merchantOperator.d.ts +9 -0
- package/dist/generated/pdas/merchantOperator.d.ts.map +1 -0
- package/dist/generated/pdas/merchantOperator.js +16 -0
- package/dist/generated/pdas/merchantOperator.js.map +1 -0
- package/dist/generated/pdas/payment.d.ts +9 -0
- package/dist/generated/pdas/payment.d.ts.map +1 -0
- package/dist/generated/pdas/payment.js +13 -0
- package/dist/generated/pdas/payment.js.map +1 -0
- package/dist/generated/pdas/paymentAccount.d.ts +10 -0
- package/dist/generated/pdas/paymentAccount.d.ts.map +1 -0
- package/dist/generated/pdas/paymentAccount.js +16 -0
- package/dist/generated/pdas/paymentAccount.js.map +1 -0
- package/dist/generated/pdas/setApprovedArbiterArbiterAccount.d.ts +8 -0
- package/dist/generated/pdas/setApprovedArbiterArbiterAccount.d.ts.map +1 -0
- package/dist/generated/pdas/setApprovedArbiterArbiterAccount.js +12 -0
- package/dist/generated/pdas/setApprovedArbiterArbiterAccount.js.map +1 -0
- package/dist/generated/programs/index.d.ts +2 -0
- package/dist/generated/programs/index.d.ts.map +1 -0
- package/dist/generated/programs/index.js +2 -0
- package/dist/generated/programs/index.js.map +1 -0
- package/dist/generated/programs/phygitalPayment.d.ts +132 -0
- package/dist/generated/programs/phygitalPayment.d.ts.map +1 -0
- package/dist/generated/programs/phygitalPayment.js +322 -0
- package/dist/generated/programs/phygitalPayment.js.map +1 -0
- package/dist/generated/types/index.d.ts +2 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +2 -0
- package/dist/generated/types/index.js.map +1 -0
- package/dist/generated/types/paymentFlags.d.ts +7 -0
- package/dist/generated/types/paymentFlags.d.ts.map +1 -0
- package/dist/generated/types/paymentFlags.js +11 -0
- package/dist/generated/types/paymentFlags.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/merchant/charge.d.ts +106 -0
- package/dist/merchant/charge.d.ts.map +1 -0
- package/dist/merchant/charge.js +311 -0
- package/dist/merchant/charge.js.map +1 -0
- package/dist/merchant/client.d.ts +80 -0
- package/dist/merchant/client.d.ts.map +1 -0
- package/dist/merchant/client.js +282 -0
- package/dist/merchant/client.js.map +1 -0
- package/dist/merchant/deferred-queue.d.ts +35 -0
- package/dist/merchant/deferred-queue.d.ts.map +1 -0
- package/dist/merchant/deferred-queue.js +237 -0
- package/dist/merchant/deferred-queue.js.map +1 -0
- package/dist/merchant/deferred-store.d.ts +67 -0
- package/dist/merchant/deferred-store.d.ts.map +1 -0
- package/dist/merchant/deferred-store.js +126 -0
- package/dist/merchant/deferred-store.js.map +1 -0
- package/dist/merchant/indexed-db-store.d.ts +6 -0
- package/dist/merchant/indexed-db-store.d.ts.map +1 -0
- package/dist/merchant/indexed-db-store.js +121 -0
- package/dist/merchant/indexed-db-store.js.map +1 -0
- package/dist/merchant/tap.d.ts +11 -0
- package/dist/merchant/tap.d.ts.map +1 -0
- package/dist/merchant/tap.js +47 -0
- package/dist/merchant/tap.js.map +1 -0
- package/dist/server/closable-store.d.ts +12 -0
- package/dist/server/closable-store.d.ts.map +1 -0
- package/dist/server/closable-store.js +16 -0
- package/dist/server/closable-store.js.map +1 -0
- package/dist/server/deferred-flusher.d.ts +19 -0
- package/dist/server/deferred-flusher.d.ts.map +1 -0
- package/dist/server/deferred-flusher.js +57 -0
- package/dist/server/deferred-flusher.js.map +1 -0
- package/dist/server/enabler-service.d.ts +20 -0
- package/dist/server/enabler-service.d.ts.map +1 -0
- package/dist/server/enabler-service.js +191 -0
- package/dist/server/enabler-service.js.map +1 -0
- package/dist/server/enabler-signer.d.ts +11 -0
- package/dist/server/enabler-signer.d.ts.map +1 -0
- package/dist/server/enabler-signer.js +37 -0
- package/dist/server/enabler-signer.js.map +1 -0
- package/dist/server/fee-budget.d.ts +22 -0
- package/dist/server/fee-budget.d.ts.map +1 -0
- package/dist/server/fee-budget.js +58 -0
- package/dist/server/fee-budget.js.map +1 -0
- package/dist/server/fee-payer.d.ts +27 -0
- package/dist/server/fee-payer.d.ts.map +1 -0
- package/dist/server/fee-payer.js +167 -0
- package/dist/server/fee-payer.js.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +14 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/indexer.d.ts +50 -0
- package/dist/server/indexer.d.ts.map +1 -0
- package/dist/server/indexer.js +218 -0
- package/dist/server/indexer.js.map +1 -0
- package/dist/server/keeper.d.ts +34 -0
- package/dist/server/keeper.d.ts.map +1 -0
- package/dist/server/keeper.js +246 -0
- package/dist/server/keeper.js.map +1 -0
- package/dist/server/pending-taps.d.ts +12 -0
- package/dist/server/pending-taps.d.ts.map +1 -0
- package/dist/server/pending-taps.js +19 -0
- package/dist/server/pending-taps.js.map +1 -0
- package/dist/server/policy.d.ts +46 -0
- package/dist/server/policy.d.ts.map +1 -0
- package/dist/server/policy.js +47 -0
- package/dist/server/policy.js.map +1 -0
- package/dist/server/provider-deferred-queue.d.ts +21 -0
- package/dist/server/provider-deferred-queue.d.ts.map +1 -0
- package/dist/server/provider-deferred-queue.js +69 -0
- package/dist/server/provider-deferred-queue.js.map +1 -0
- package/dist/server/queue.d.ts +43 -0
- package/dist/server/queue.d.ts.map +1 -0
- package/dist/server/queue.js +105 -0
- package/dist/server/queue.js.map +1 -0
- package/dist/server/router.d.ts +21 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +137 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/webauthn.d.ts +2 -0
- package/dist/server/webauthn.d.ts.map +1 -0
- package/dist/server/webauthn.js +19 -0
- package/dist/server/webauthn.js.map +1 -0
- package/dist/wallet/client.d.ts +106 -0
- package/dist/wallet/client.d.ts.map +1 -0
- package/dist/wallet/client.js +354 -0
- package/dist/wallet/client.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { verifyAuthenticationResponse } from "@simplewebauthn/server";
|
|
2
|
+
import { fetchAssetFromCredentialId } from "phygital-token-sdk";
|
|
3
|
+
import { base58ToBytes, base64UrlToBytes, bytesToBase64Url, toUint8Array, } from "../core/bytes.js";
|
|
4
|
+
import { assertValidReference, buildTapChallenge } from "../core/challenge.js";
|
|
5
|
+
import { PolicyViolationError } from "../core/errors.js";
|
|
6
|
+
import { fetchEscrowBalance, fetchPaymentAccountSummary, effectiveMaxTapAmount } from "../core/payment.js";
|
|
7
|
+
import { nowSeconds, PROTOCOL_CONSTANTS } from "../core/time.js";
|
|
8
|
+
import { verifyP256Signature } from "./enabler-signer.js";
|
|
9
|
+
import { compressedP256ToCoseKey } from "./webauthn.js";
|
|
10
|
+
export async function tapFingerprint(request) {
|
|
11
|
+
const payload = [
|
|
12
|
+
request.response.id,
|
|
13
|
+
request.mint,
|
|
14
|
+
request.amount,
|
|
15
|
+
request.destination,
|
|
16
|
+
String(request.issuedAt),
|
|
17
|
+
].join("|");
|
|
18
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(payload));
|
|
19
|
+
return bytesToBase64Url(new Uint8Array(digest));
|
|
20
|
+
}
|
|
21
|
+
export function createEnablerService(config) {
|
|
22
|
+
const policy = config.policy ?? {};
|
|
23
|
+
const expectedOrigins = [...([config.expectedOrigins].flat())];
|
|
24
|
+
const expectedRPID = [...([config.expectedRPID].flat())];
|
|
25
|
+
async function validateAndSign(request) {
|
|
26
|
+
let amount;
|
|
27
|
+
try {
|
|
28
|
+
amount = BigInt(request.amount);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new PolicyViolationError("invalid_amount", "amount is not a u64 string");
|
|
32
|
+
}
|
|
33
|
+
if (amount <= 0n) {
|
|
34
|
+
throw new PolicyViolationError("invalid_amount", "amount must be positive");
|
|
35
|
+
}
|
|
36
|
+
let reference;
|
|
37
|
+
try {
|
|
38
|
+
reference = base58ToBytes(request.reference);
|
|
39
|
+
assertValidReference(reference);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new PolicyViolationError("invalid_reference", "reference must be a base58 non-zero 32-byte value");
|
|
43
|
+
}
|
|
44
|
+
const fingerprint = await tapFingerprint(request);
|
|
45
|
+
const cached = await config.replayStore.getCosignReplay(request.reference);
|
|
46
|
+
if (cached) {
|
|
47
|
+
if (cached.fingerprint === fingerprint) {
|
|
48
|
+
return cached.response;
|
|
49
|
+
}
|
|
50
|
+
throw new PolicyViolationError("replayed_reference", "this payment reference was already co-signed for a different tap");
|
|
51
|
+
}
|
|
52
|
+
const challenge = buildTapChallenge({
|
|
53
|
+
mint: request.mint,
|
|
54
|
+
amount,
|
|
55
|
+
merchant: request.destination,
|
|
56
|
+
reference,
|
|
57
|
+
issuedAt: request.issuedAt,
|
|
58
|
+
});
|
|
59
|
+
const expectedChallenge = bytesToBase64Url(challenge);
|
|
60
|
+
const { publicKey, asset } = await fetchAssetFromCredentialId(request.response.id, config.rpc);
|
|
61
|
+
if (!asset.isLocked) {
|
|
62
|
+
throw new PolicyViolationError("asset_not_locked", "accessory asset must be locked to authorize payments");
|
|
63
|
+
}
|
|
64
|
+
const credentialPublicKey = base64UrlToBytes(publicKey);
|
|
65
|
+
let verification;
|
|
66
|
+
try {
|
|
67
|
+
verification = await verifyAuthenticationResponse({
|
|
68
|
+
response: request.response,
|
|
69
|
+
expectedChallenge,
|
|
70
|
+
expectedOrigin: expectedOrigins,
|
|
71
|
+
expectedRPID,
|
|
72
|
+
requireUserVerification: false,
|
|
73
|
+
credential: {
|
|
74
|
+
id: request.response.id,
|
|
75
|
+
publicKey: new Uint8Array(compressedP256ToCoseKey(credentialPublicKey)),
|
|
76
|
+
counter: 0,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw mapWebAuthnError(error);
|
|
82
|
+
}
|
|
83
|
+
if (!verification.verified) {
|
|
84
|
+
throw new PolicyViolationError("invalid_signature", "assertion signature does not verify against the registered credential");
|
|
85
|
+
}
|
|
86
|
+
const now = nowSeconds();
|
|
87
|
+
const maxAge = policy.maxTapAgeSecs ?? PROTOCOL_CONSTANTS.clockSkewSecs;
|
|
88
|
+
const maxFuture = policy.allowFutureIssuedAtSecs ?? PROTOCOL_CONSTANTS.clockSkewSecs;
|
|
89
|
+
if (request.issuedAt < now - maxAge) {
|
|
90
|
+
throw new PolicyViolationError("stale_tap", `issuedAt is older than ${maxAge}s`);
|
|
91
|
+
}
|
|
92
|
+
if (request.issuedAt > now + maxFuture) {
|
|
93
|
+
throw new PolicyViolationError("future_tap", `issuedAt is more than ${maxFuture}s in the future`);
|
|
94
|
+
}
|
|
95
|
+
if (policy.maxAmountPerTap !== undefined && amount > policy.maxAmountPerTap) {
|
|
96
|
+
throw new PolicyViolationError("max_amount", `amount ${amount} exceeds the per-tap ceiling ${policy.maxAmountPerTap}`);
|
|
97
|
+
}
|
|
98
|
+
if (policy.allowedMints && !policy.allowedMints.includes(request.mint)) {
|
|
99
|
+
throw new PolicyViolationError("mint_not_allowed", String(request.mint));
|
|
100
|
+
}
|
|
101
|
+
if (policy.custom) {
|
|
102
|
+
const context = {
|
|
103
|
+
request,
|
|
104
|
+
challenge,
|
|
105
|
+
credentialPublicKey,
|
|
106
|
+
asset,
|
|
107
|
+
amount,
|
|
108
|
+
reference,
|
|
109
|
+
};
|
|
110
|
+
await policy.custom(context);
|
|
111
|
+
}
|
|
112
|
+
const paymentAccount = await fetchPaymentAccountSummary(config.rpc, {
|
|
113
|
+
owner: asset.owner,
|
|
114
|
+
mint: request.mint,
|
|
115
|
+
tokenProgram: request.tokenProgram,
|
|
116
|
+
});
|
|
117
|
+
if (paymentAccount === null) {
|
|
118
|
+
throw new PolicyViolationError("tap_limit_not_set", "payer has no payment account for this mint");
|
|
119
|
+
}
|
|
120
|
+
const maxTap = effectiveMaxTapAmount(paymentAccount, now);
|
|
121
|
+
if (maxTap === 0n) {
|
|
122
|
+
throw new PolicyViolationError("tap_limit_not_set", "payer has not set a per-tap ceiling");
|
|
123
|
+
}
|
|
124
|
+
if (amount > maxTap) {
|
|
125
|
+
throw new PolicyViolationError("tap_limit_exceeded", `amount ${amount} exceeds the payer's effective per-tap ceiling ${maxTap}`);
|
|
126
|
+
}
|
|
127
|
+
const escrow = await fetchEscrowBalance(config.rpc, {
|
|
128
|
+
owner: asset.owner,
|
|
129
|
+
mint: request.mint,
|
|
130
|
+
tokenProgram: request.tokenProgram,
|
|
131
|
+
});
|
|
132
|
+
const freeEscrow = escrow?.free ?? 0n;
|
|
133
|
+
const reservation = await config.exposureStore.tryReserve({
|
|
134
|
+
payer: asset.owner,
|
|
135
|
+
mint: request.mint,
|
|
136
|
+
reference: request.reference,
|
|
137
|
+
amount,
|
|
138
|
+
freeEscrow,
|
|
139
|
+
expiresAt: request.issuedAt + PROTOCOL_CONSTANTS.authorizationTtlSecs,
|
|
140
|
+
});
|
|
141
|
+
if (!reservation.reserved) {
|
|
142
|
+
throw new PolicyViolationError("exposure_exceeded", `outstanding ${reservation.outstandingBefore} + amount ${amount} exceeds free escrow ${freeEscrow}`);
|
|
143
|
+
}
|
|
144
|
+
let signature;
|
|
145
|
+
try {
|
|
146
|
+
signature = await config.signer.sign(challenge);
|
|
147
|
+
if (!verifyP256Signature(signature, challenge, toUint8Array(config.signer.publicKey))) {
|
|
148
|
+
throw new PolicyViolationError("signer_malfunction", "enabler signature failed self-verification");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
await config.exposureStore.release(request.reference);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
const response = {
|
|
156
|
+
publicKey: bytesToBase64Url(toUint8Array(config.signer.publicKey)),
|
|
157
|
+
signature: bytesToBase64Url(signature),
|
|
158
|
+
paymentAccessory: publicKey,
|
|
159
|
+
payer: asset.owner,
|
|
160
|
+
outstandingExposure: reservation.outstandingBefore.toString(),
|
|
161
|
+
freeEscrow: freeEscrow.toString(),
|
|
162
|
+
};
|
|
163
|
+
await config.replayStore.putCosignReplay(request.reference, {
|
|
164
|
+
fingerprint,
|
|
165
|
+
response,
|
|
166
|
+
});
|
|
167
|
+
return response;
|
|
168
|
+
}
|
|
169
|
+
return { validateAndSign, publicKey: config.signer.publicKey };
|
|
170
|
+
}
|
|
171
|
+
function mapWebAuthnError(error) {
|
|
172
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
173
|
+
const lower = message.toLowerCase();
|
|
174
|
+
if (lower.includes("challenge")) {
|
|
175
|
+
return new PolicyViolationError("challenge_mismatch", message);
|
|
176
|
+
}
|
|
177
|
+
if (lower.includes("user not present")) {
|
|
178
|
+
return new PolicyViolationError("user_not_present", message);
|
|
179
|
+
}
|
|
180
|
+
if (lower.includes("origin")) {
|
|
181
|
+
return new PolicyViolationError("origin_not_allowed", message);
|
|
182
|
+
}
|
|
183
|
+
if (lower.includes("rp id") || lower.includes("rpid")) {
|
|
184
|
+
return new PolicyViolationError("rpid_not_allowed", message);
|
|
185
|
+
}
|
|
186
|
+
if (lower.includes("signature") || lower.includes("public key")) {
|
|
187
|
+
return new PolicyViolationError("invalid_signature", message);
|
|
188
|
+
}
|
|
189
|
+
return new PolicyViolationError("invalid_assertion", message);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=enabler-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enabler-service.js","sourceRoot":"","sources":["../../src/server/enabler-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface EnablerSigner {
|
|
2
|
+
publicKey: Uint8Array;
|
|
3
|
+
sign(message: Uint8Array): Promise<Uint8Array>;
|
|
4
|
+
}
|
|
5
|
+
export declare function createEnablerSigner(privateKey: Uint8Array): EnablerSigner;
|
|
6
|
+
export declare function generateEnablerKeypair(): {
|
|
7
|
+
privateKey: Uint8Array;
|
|
8
|
+
signer: EnablerSigner;
|
|
9
|
+
};
|
|
10
|
+
export declare function verifyP256Signature(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean;
|
|
11
|
+
//# sourceMappingURL=enabler-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enabler-signer.d.ts","sourceRoot":"","sources":["../../src/server/enabler-signer.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAE5B,SAAS,EAAE,UAAU,CAAC;IAKtB,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChD;AAGD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAezE;AAOD,wBAAgB,sBAAsB,IAAI;IACxC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;CACvB,CAGA;AAGD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAeT"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { p256 } from "@noble/curves/nist.js";
|
|
2
|
+
import { ConfigurationError } from "../core/errors.js";
|
|
3
|
+
export function createEnablerSigner(privateKey) {
|
|
4
|
+
if (privateKey.length !== 32) {
|
|
5
|
+
throw new ConfigurationError(`Enabler private key must be 32 bytes, got ${privateKey.length}.`);
|
|
6
|
+
}
|
|
7
|
+
const publicKey = p256.getPublicKey(privateKey, true);
|
|
8
|
+
return {
|
|
9
|
+
publicKey,
|
|
10
|
+
sign(message) {
|
|
11
|
+
return Promise.resolve(p256.sign(message, privateKey, { prehash: true }));
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function generateEnablerKeypair() {
|
|
16
|
+
const privateKey = p256.utils.randomSecretKey();
|
|
17
|
+
return { privateKey, signer: createEnablerSigner(privateKey) };
|
|
18
|
+
}
|
|
19
|
+
export function verifyP256Signature(signature, message, publicKey) {
|
|
20
|
+
let compact;
|
|
21
|
+
try {
|
|
22
|
+
compact =
|
|
23
|
+
signature.length === 64
|
|
24
|
+
? signature
|
|
25
|
+
: p256.Signature.fromBytes(signature, "der").toBytes("compact");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
return p256.verify(compact, message, publicKey, { prehash: true });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=enabler-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enabler-signer.js","sourceRoot":"","sources":["../../src/server/enabler-signer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAavD,MAAM,UAAU,mBAAmB,CAAC,UAAsB;IACxD,IAAI,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,kBAAkB,CAC1B,6CAA6C,UAAU,CAAC,MAAM,GAAG,CAClE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO;QACL,SAAS;QACT,IAAI,CAAC,OAAO;YAGV,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,sBAAsB;IAIpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IAChD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AACjE,CAAC;AAGD,MAAM,UAAU,mBAAmB,CACjC,SAAqB,EACrB,OAAmB,EACnB,SAAqB;IAErB,IAAI,OAAmB,CAAC;IACxB,IAAI,CAAC;QACH,OAAO;YACL,SAAS,CAAC,MAAM,KAAK,EAAE;gBACrB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import { type SponsoredChargeSummary, type SponsorshipAuthorizer } from "./fee-payer.js";
|
|
3
|
+
export declare const BASE_FEE_LAMPORTS_PER_SIGNATURE = 5000n;
|
|
4
|
+
export interface SponsorshipCostOptions {
|
|
5
|
+
baseFeeLamportsPerSignature?: bigint;
|
|
6
|
+
rentPerPaymentLamports: bigint;
|
|
7
|
+
}
|
|
8
|
+
export interface SponsoredCost {
|
|
9
|
+
total: bigint;
|
|
10
|
+
byMerchant: Map<Address, bigint>;
|
|
11
|
+
rentByMerchant: Map<Address, bigint>;
|
|
12
|
+
}
|
|
13
|
+
export declare function sponsoredCostByMerchant(summary: SponsoredChargeSummary, options: SponsorshipCostOptions): SponsoredCost;
|
|
14
|
+
export interface FeeBudgetStore {
|
|
15
|
+
getRemaining(merchant: Address): Promise<bigint> | bigint;
|
|
16
|
+
tryDeduct(merchant: Address, lamports: bigint): Promise<boolean> | boolean;
|
|
17
|
+
credit(merchant: Address, lamports: bigint): Promise<void> | void;
|
|
18
|
+
}
|
|
19
|
+
export declare function createInMemoryFeeBudgetStore(initial?: Iterable<readonly [Address, bigint]>): FeeBudgetStore;
|
|
20
|
+
export declare function createSponsorshipBudgetAuthorizer(store: FeeBudgetStore, options: SponsorshipCostOptions): SponsorshipAuthorizer;
|
|
21
|
+
export declare function creditReclaimedRent(store: FeeBudgetStore, merchant: Address, rentPerPaymentLamports: bigint): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=fee-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-budget.d.ts","sourceRoot":"","sources":["../../src/server/fee-budget.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAA2B,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGlH,eAAO,MAAM,+BAA+B,QAAS,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IAErC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAMrC,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAGD,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,CAAC;IAEd,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjC,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CACtC;AAOD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,sBAAsB,GAC9B,aAAa,CA2Bf;AAOD,MAAM,WAAW,cAAc;IAE7B,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAE1D,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAE3E,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnE;AAGD,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAC7C,cAAc,CAchB;AAqBD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAevB;AAOD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,OAAO,EACjB,sBAAsB,EAAE,MAAM,GAC7B,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { FeePayerValidationError } from "./fee-payer.js";
|
|
2
|
+
export const BASE_FEE_LAMPORTS_PER_SIGNATURE = 5000n;
|
|
3
|
+
export function sponsoredCostByMerchant(summary, options) {
|
|
4
|
+
const baseFeePerSig = options.baseFeeLamportsPerSignature ?? BASE_FEE_LAMPORTS_PER_SIGNATURE;
|
|
5
|
+
const rentPerPayment = options.rentPerPaymentLamports;
|
|
6
|
+
const transfers = summary.merchants.length;
|
|
7
|
+
const baseFee = baseFeePerSig * BigInt(summary.signatureCount);
|
|
8
|
+
const sharedFee = baseFee + summary.priorityFeeLamports;
|
|
9
|
+
const total = sharedFee + rentPerPayment * BigInt(transfers);
|
|
10
|
+
const byMerchant = new Map();
|
|
11
|
+
const rentByMerchant = new Map();
|
|
12
|
+
if (transfers === 0)
|
|
13
|
+
return { total, byMerchant, rentByMerchant };
|
|
14
|
+
const sharePerTransfer = sharedFee / BigInt(transfers);
|
|
15
|
+
const remainder = sharedFee - sharePerTransfer * BigInt(transfers);
|
|
16
|
+
summary.merchants.forEach((merchant, i) => {
|
|
17
|
+
const feeShare = sharePerTransfer + (i === 0 ? remainder : 0n);
|
|
18
|
+
const cost = feeShare + rentPerPayment;
|
|
19
|
+
byMerchant.set(merchant, (byMerchant.get(merchant) ?? 0n) + cost);
|
|
20
|
+
rentByMerchant.set(merchant, (rentByMerchant.get(merchant) ?? 0n) + rentPerPayment);
|
|
21
|
+
});
|
|
22
|
+
return { total, byMerchant, rentByMerchant };
|
|
23
|
+
}
|
|
24
|
+
export function createInMemoryFeeBudgetStore(initial) {
|
|
25
|
+
const balances = new Map(initial);
|
|
26
|
+
return {
|
|
27
|
+
getRemaining: (merchant) => balances.get(merchant) ?? 0n,
|
|
28
|
+
tryDeduct(merchant, lamports) {
|
|
29
|
+
const remaining = balances.get(merchant) ?? 0n;
|
|
30
|
+
if (remaining < lamports)
|
|
31
|
+
return false;
|
|
32
|
+
balances.set(merchant, remaining - lamports);
|
|
33
|
+
return true;
|
|
34
|
+
},
|
|
35
|
+
credit(merchant, lamports) {
|
|
36
|
+
balances.set(merchant, (balances.get(merchant) ?? 0n) + lamports);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function createSponsorshipBudgetAuthorizer(store, options) {
|
|
41
|
+
return async (summary) => {
|
|
42
|
+
const { byMerchant } = sponsoredCostByMerchant(summary, options);
|
|
43
|
+
const deducted = [];
|
|
44
|
+
for (const [merchant, cost] of byMerchant) {
|
|
45
|
+
const ok = await store.tryDeduct(merchant, cost);
|
|
46
|
+
if (!ok) {
|
|
47
|
+
for (const [m, c] of deducted)
|
|
48
|
+
await store.credit(m, c);
|
|
49
|
+
throw new FeePayerValidationError(`merchant ${merchant} has insufficient fee budget for ${cost} lamports`);
|
|
50
|
+
}
|
|
51
|
+
deducted.push([merchant, cost]);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function creditReclaimedRent(store, merchant, rentPerPaymentLamports) {
|
|
56
|
+
await store.credit(merchant, rentPerPaymentLamports);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=fee-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-budget.js","sourceRoot":"","sources":["../../src/server/fee-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Address, type Transaction, type TransactionSigner } from "@solana/kit";
|
|
2
|
+
export declare const SECP256R1_PROGRAM_ADDRESS: Address<"Secp256r1SigVerify1111111111111111111111111">;
|
|
3
|
+
export declare const COMPUTE_BUDGET_PROGRAM_ADDRESS: Address<"ComputeBudget111111111111111111111111111111">;
|
|
4
|
+
export declare const DEFAULT_MAX_PRIORITY_FEE_LAMPORTS = 100000n;
|
|
5
|
+
export declare class FeePayerValidationError extends Error {
|
|
6
|
+
readonly code = "fee_payer_validation";
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
export interface SponsoredChargeSummary {
|
|
10
|
+
transferCount: number;
|
|
11
|
+
merchants: Address[];
|
|
12
|
+
signatureCount: number;
|
|
13
|
+
priorityFeeLamports: bigint;
|
|
14
|
+
}
|
|
15
|
+
export type SponsorshipAuthorizer = (summary: SponsoredChargeSummary) => void | Promise<void>;
|
|
16
|
+
export interface FeePayerServiceConfig {
|
|
17
|
+
maxPriorityFeeLamports?: bigint;
|
|
18
|
+
}
|
|
19
|
+
export interface FeePayerService {
|
|
20
|
+
address: Address;
|
|
21
|
+
signChargeTransaction(transactionBase64: string, authorize?: SponsorshipAuthorizer): Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createFeePayerService(feePayer: TransactionSigner, config?: FeePayerServiceConfig): FeePayerService;
|
|
24
|
+
export declare function validateChargeTransaction(transaction: Transaction, expectedFeePayer: Address, options?: {
|
|
25
|
+
maxPriorityFeeLamports?: bigint;
|
|
26
|
+
}): SponsoredChargeSummary;
|
|
27
|
+
//# sourceMappingURL=fee-payer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-payer.d.ts","sourceRoot":"","sources":["../../src/server/fee-payer.ts"],"names":[],"mappings":"AAQA,OAAO,EAML,KAAK,OAAO,EAEZ,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,yBAAyB,wDAErC,CAAC;AAGF,eAAO,MAAM,8BAA8B,wDAE1C,CAAC;AAqBF,eAAO,MAAM,iCAAiC,UAAW,CAAC;AAE1D,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,0BAA0B;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAGD,MAAM,WAAW,sBAAsB;IAErC,aAAa,EAAE,MAAM,CAAC;IAMtB,SAAS,EAAE,OAAO,EAAE,CAAC;IAMrB,cAAc,EAAE,MAAM,CAAC;IAKvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAQD,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,sBAAsB,KAC5B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IAKpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAE9B,OAAO,EAAE,OAAO,CAAC;IAKjB,qBAAqB,CACnB,iBAAiB,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,qBAAqB,GAChC,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAMD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,GAAE,qBAA0B,GACjC,eAAe,CAwCjB;AA0ED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,OAAO,EACzB,OAAO,GAAE;IAAE,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,sBAAsB,CAoGxB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { address, assertIsTransactionPartialSigner, decompileTransactionMessage, getCompiledTransactionMessageDecoder, getTransactionDecoder, } from "@solana/kit";
|
|
2
|
+
import { parseTransferInstruction } from "../generated/instructions/transfer.js";
|
|
3
|
+
import { PHYGITAL_PAYMENT_PROGRAM_ADDRESS } from "../generated/programs/phygitalPayment.js";
|
|
4
|
+
import { base64ToBytes, bytesToBase64 } from "../core/bytes.js";
|
|
5
|
+
export const SECP256R1_PROGRAM_ADDRESS = address("Secp256r1SigVerify1111111111111111111111111");
|
|
6
|
+
export const COMPUTE_BUDGET_PROGRAM_ADDRESS = address("ComputeBudget111111111111111111111111111111");
|
|
7
|
+
const CB_REQUEST_UNITS_DEPRECATED = 0x00;
|
|
8
|
+
const CB_REQUEST_HEAP_FRAME = 0x01;
|
|
9
|
+
const CB_SET_COMPUTE_UNIT_LIMIT = 0x02;
|
|
10
|
+
const CB_SET_COMPUTE_UNIT_PRICE = 0x03;
|
|
11
|
+
const CB_SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 0x04;
|
|
12
|
+
const MAX_COMPUTE_UNIT_LIMIT = 1400000n;
|
|
13
|
+
const MICRO_LAMPORTS_PER_LAMPORT = 1000000n;
|
|
14
|
+
export const DEFAULT_MAX_PRIORITY_FEE_LAMPORTS = 100000n;
|
|
15
|
+
export class FeePayerValidationError extends Error {
|
|
16
|
+
code = "fee_payer_validation";
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "FeePayerValidationError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function createFeePayerService(feePayer, config = {}) {
|
|
23
|
+
assertIsTransactionPartialSigner(feePayer);
|
|
24
|
+
const maxPriorityFeeLamports = config.maxPriorityFeeLamports ?? DEFAULT_MAX_PRIORITY_FEE_LAMPORTS;
|
|
25
|
+
return {
|
|
26
|
+
address: feePayer.address,
|
|
27
|
+
async signChargeTransaction(transactionBase64, authorize) {
|
|
28
|
+
let transaction;
|
|
29
|
+
try {
|
|
30
|
+
transaction = getTransactionDecoder().decode(base64ToBytes(transactionBase64));
|
|
31
|
+
}
|
|
32
|
+
catch (cause) {
|
|
33
|
+
throw new FeePayerValidationError(`transaction is not a valid Solana wire encoding: ${cause.message}`);
|
|
34
|
+
}
|
|
35
|
+
const summary = validateChargeTransaction(transaction, feePayer.address, {
|
|
36
|
+
maxPriorityFeeLamports,
|
|
37
|
+
});
|
|
38
|
+
if (authorize) {
|
|
39
|
+
await authorize(summary);
|
|
40
|
+
}
|
|
41
|
+
const [dictionary] = await feePayer.signTransactions([
|
|
42
|
+
transaction,
|
|
43
|
+
]);
|
|
44
|
+
const signature = dictionary?.[feePayer.address];
|
|
45
|
+
if (!signature || signature.length !== 64) {
|
|
46
|
+
throw new FeePayerValidationError("fee payer signer did not return a 64-byte ed25519 signature");
|
|
47
|
+
}
|
|
48
|
+
return bytesToBase64(new Uint8Array(signature));
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function computePriorityFeeLamports(computeBudgetData) {
|
|
53
|
+
let unitPrice = null;
|
|
54
|
+
let unitLimit = null;
|
|
55
|
+
for (const data of computeBudgetData) {
|
|
56
|
+
const discriminator = data[0];
|
|
57
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
58
|
+
switch (discriminator) {
|
|
59
|
+
case CB_SET_COMPUTE_UNIT_PRICE: {
|
|
60
|
+
if (unitPrice !== null) {
|
|
61
|
+
throw new FeePayerValidationError("duplicate SetComputeUnitPrice instruction");
|
|
62
|
+
}
|
|
63
|
+
if (data.length < 9) {
|
|
64
|
+
throw new FeePayerValidationError("malformed SetComputeUnitPrice instruction");
|
|
65
|
+
}
|
|
66
|
+
unitPrice = view.getBigUint64(1, true);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case CB_SET_COMPUTE_UNIT_LIMIT: {
|
|
70
|
+
if (unitLimit !== null) {
|
|
71
|
+
throw new FeePayerValidationError("duplicate SetComputeUnitLimit instruction");
|
|
72
|
+
}
|
|
73
|
+
if (data.length < 5) {
|
|
74
|
+
throw new FeePayerValidationError("malformed SetComputeUnitLimit instruction");
|
|
75
|
+
}
|
|
76
|
+
unitLimit = BigInt(view.getUint32(1, true));
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case CB_REQUEST_HEAP_FRAME:
|
|
80
|
+
case CB_SET_LOADED_ACCOUNTS_DATA_SIZE_LIMIT:
|
|
81
|
+
case CB_REQUEST_UNITS_DEPRECATED:
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
throw new FeePayerValidationError(`unrecognized ComputeBudget instruction (discriminator ${discriminator})`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (unitPrice === null || unitPrice === 0n)
|
|
88
|
+
return 0n;
|
|
89
|
+
const limit = unitLimit ?? MAX_COMPUTE_UNIT_LIMIT;
|
|
90
|
+
return ((limit * unitPrice + MICRO_LAMPORTS_PER_LAMPORT - 1n) /
|
|
91
|
+
MICRO_LAMPORTS_PER_LAMPORT);
|
|
92
|
+
}
|
|
93
|
+
export function validateChargeTransaction(transaction, expectedFeePayer, options = {}) {
|
|
94
|
+
const maxPriorityFeeLamports = options.maxPriorityFeeLamports ?? DEFAULT_MAX_PRIORITY_FEE_LAMPORTS;
|
|
95
|
+
let compiled;
|
|
96
|
+
try {
|
|
97
|
+
compiled = getCompiledTransactionMessageDecoder().decode(transaction.messageBytes);
|
|
98
|
+
}
|
|
99
|
+
catch (cause) {
|
|
100
|
+
throw new FeePayerValidationError(`cannot decode transaction message: ${cause.message}`);
|
|
101
|
+
}
|
|
102
|
+
let message;
|
|
103
|
+
try {
|
|
104
|
+
message = decompileTransactionMessage(compiled);
|
|
105
|
+
}
|
|
106
|
+
catch (cause) {
|
|
107
|
+
throw new FeePayerValidationError(`cannot decompile transaction message: ${cause.message}`);
|
|
108
|
+
}
|
|
109
|
+
if (message.feePayer.address !== expectedFeePayer) {
|
|
110
|
+
throw new FeePayerValidationError(`fee payer is ${message.feePayer.address}, expected ${expectedFeePayer}`);
|
|
111
|
+
}
|
|
112
|
+
const instructions = message.instructions ?? [];
|
|
113
|
+
let transferCount = 0;
|
|
114
|
+
let secpCount = 0;
|
|
115
|
+
const merchants = [];
|
|
116
|
+
const computeBudgetData = [];
|
|
117
|
+
for (const instruction of instructions) {
|
|
118
|
+
const program = instruction.programAddress;
|
|
119
|
+
if (program === COMPUTE_BUDGET_PROGRAM_ADDRESS) {
|
|
120
|
+
const data = instruction.data;
|
|
121
|
+
if (!data || data.length === 0) {
|
|
122
|
+
throw new FeePayerValidationError("ComputeBudget instruction has no data");
|
|
123
|
+
}
|
|
124
|
+
computeBudgetData.push(new Uint8Array(data));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (program === SECP256R1_PROGRAM_ADDRESS) {
|
|
128
|
+
secpCount += 1;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (program === PHYGITAL_PAYMENT_PROGRAM_ADDRESS) {
|
|
132
|
+
let parsed;
|
|
133
|
+
try {
|
|
134
|
+
parsed = parseTransferInstruction(instruction);
|
|
135
|
+
}
|
|
136
|
+
catch (cause) {
|
|
137
|
+
throw new FeePayerValidationError(`payment-program instruction is not a transfer: ${cause.message}`);
|
|
138
|
+
}
|
|
139
|
+
if (parsed.accounts.rentPayer.address !== expectedFeePayer) {
|
|
140
|
+
throw new FeePayerValidationError(`transfer rentPayer is ${parsed.accounts.rentPayer.address}, expected ${expectedFeePayer}`);
|
|
141
|
+
}
|
|
142
|
+
merchants.push(parsed.accounts.merchant.address);
|
|
143
|
+
transferCount += 1;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
throw new FeePayerValidationError(`disallowed program in charge transaction: ${program}`);
|
|
147
|
+
}
|
|
148
|
+
if (secpCount !== 1) {
|
|
149
|
+
throw new FeePayerValidationError(`expected exactly one secp256r1 verify instruction, found ${secpCount}`);
|
|
150
|
+
}
|
|
151
|
+
if (transferCount < 1 || transferCount > 4) {
|
|
152
|
+
throw new FeePayerValidationError(`expected between 1 and 4 transfer instructions, found ${transferCount}`);
|
|
153
|
+
}
|
|
154
|
+
const priorityFeeLamports = computePriorityFeeLamports(computeBudgetData);
|
|
155
|
+
if (priorityFeeLamports > maxPriorityFeeLamports) {
|
|
156
|
+
throw new FeePayerValidationError(`priority fee ${priorityFeeLamports} lamports exceeds the sponsor cap ${maxPriorityFeeLamports}`);
|
|
157
|
+
}
|
|
158
|
+
const signatureCount = numRequiredSignatures(compiled);
|
|
159
|
+
return { transferCount, merchants, signatureCount, priorityFeeLamports };
|
|
160
|
+
}
|
|
161
|
+
function numRequiredSignatures(compiled) {
|
|
162
|
+
const header = compiled
|
|
163
|
+
.header;
|
|
164
|
+
const n = header?.numSignerAccounts;
|
|
165
|
+
return typeof n === "number" && n > 0 ? n : 1;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=fee-payer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-payer.js","sourceRoot":"","sources":["../../src/server/fee-payer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { createEnablerSigner, generateEnablerKeypair, verifyP256Signature, type EnablerSigner, } from "./enabler-signer.js";
|
|
2
|
+
export { createEnablerService, tapFingerprint, type EnablerService, type EnablerServiceConfig, } from "./enabler-service.js";
|
|
3
|
+
export { compressedP256ToCoseKey } from "./webauthn.js";
|
|
4
|
+
export { createInMemoryReferenceStore, createInMemoryExposureStore, type CosignReplayEntry, type EnablerPolicy, type EnablerRequestContext, type ExposureStore, type ReplayStore, } from "./policy.js";
|
|
5
|
+
export { createInMemoryPendingTapStore, type PendingTapStore, } from "./pending-taps.js";
|
|
6
|
+
export { createProviderDeferredQueue, DEFAULT_PROVIDER_LEAD_TIME_SECS, type ProviderDeferredQueue, type ProviderDeferredQueueConfig, } from "./provider-deferred-queue.js";
|
|
7
|
+
export { createInMemoryQueueStore, createQueueRunner, type QueuedItem, type QueueRunner, type QueueRunnerConfig, type QueueStore, } from "./queue.js";
|
|
8
|
+
export { createFeePayerService, validateChargeTransaction, COMPUTE_BUDGET_PROGRAM_ADDRESS, SECP256R1_PROGRAM_ADDRESS, DEFAULT_MAX_PRIORITY_FEE_LAMPORTS, FeePayerValidationError, type FeePayerService, type FeePayerServiceConfig, type SponsoredChargeSummary, type SponsorshipAuthorizer, } from "./fee-payer.js";
|
|
9
|
+
export { createInMemoryClosableStore, type ClosablePayment, type ClosablePaymentStore, } from "./closable-store.js";
|
|
10
|
+
export { createInMemoryFeeBudgetStore, createSponsorshipBudgetAuthorizer, sponsoredCostByMerchant, creditReclaimedRent, BASE_FEE_LAMPORTS_PER_SIGNATURE, type FeeBudgetStore, type SponsoredCost, type SponsorshipCostOptions, } from "./fee-budget.js";
|
|
11
|
+
export { createProviderRouter, type ProviderEndpoint, type ProviderRouterConfig, } from "./router.js";
|
|
12
|
+
export { createKeeper, type Keeper, type KeeperConfig, } from "./keeper.js";
|
|
13
|
+
export { applyEventToStore, createEventIndexer, createInMemoryIndexerStore, refreshIndexedPayment, type EventIndexer, type EventIndexerConfig, type IndexedPayment, type IndexerStore, type ReconcileInput, } from "./indexer.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,EAC7B,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,8BAA8B,EAC9B,yBAAyB,EACzB,iCAAiC,EACjC,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,uBAAuB,EACvB,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { createEnablerSigner, generateEnablerKeypair, verifyP256Signature, } from "./enabler-signer.js";
|
|
2
|
+
export { createEnablerService, tapFingerprint, } from "./enabler-service.js";
|
|
3
|
+
export { compressedP256ToCoseKey } from "./webauthn.js";
|
|
4
|
+
export { createInMemoryReferenceStore, createInMemoryExposureStore, } from "./policy.js";
|
|
5
|
+
export { createInMemoryPendingTapStore, } from "./pending-taps.js";
|
|
6
|
+
export { createProviderDeferredQueue, DEFAULT_PROVIDER_LEAD_TIME_SECS, } from "./provider-deferred-queue.js";
|
|
7
|
+
export { createInMemoryQueueStore, createQueueRunner, } from "./queue.js";
|
|
8
|
+
export { createFeePayerService, validateChargeTransaction, COMPUTE_BUDGET_PROGRAM_ADDRESS, SECP256R1_PROGRAM_ADDRESS, DEFAULT_MAX_PRIORITY_FEE_LAMPORTS, FeePayerValidationError, } from "./fee-payer.js";
|
|
9
|
+
export { createInMemoryClosableStore, } from "./closable-store.js";
|
|
10
|
+
export { createInMemoryFeeBudgetStore, createSponsorshipBudgetAuthorizer, sponsoredCostByMerchant, creditReclaimedRent, BASE_FEE_LAMPORTS_PER_SIGNATURE, } from "./fee-budget.js";
|
|
11
|
+
export { createProviderRouter, } from "./router.js";
|
|
12
|
+
export { createKeeper, } from "./keeper.js";
|
|
13
|
+
export { applyEventToStore, createEventIndexer, createInMemoryIndexerStore, refreshIndexedPayment, } from "./indexer.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,GAM5B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,GAE9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,GAGhC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,wBAAwB,EACxB,iBAAiB,GAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,8BAA8B,EAC9B,yBAAyB,EACzB,iCAAiC,EACjC,uBAAuB,GAKxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,GAG5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,uBAAuB,EACvB,mBAAmB,EACnB,+BAA+B,GAIhC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,GAGrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,qBAAqB,GAMtB,MAAM,cAAc,CAAC"}
|