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
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# phygital-payment-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for on-chain, in-person NFC **tap-to-pay** on Solana.
|
|
4
|
+
|
|
5
|
+
> **0.1.0 — early preview.** APIs may break. Not security-audited. Do not use for mainnet value
|
|
6
|
+
> without your own review. In-memory provider stores are for development only — production providers
|
|
7
|
+
> must supply durable `ReplayStore` / `ExposureStore` / `FeeBudgetStore` and HSM-backed enabler keys.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add phygital-payment-sdk @solana/kit
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
ESM only. `@solana/kit` `^6.4.0` is a peer dependency.
|
|
14
|
+
|
|
15
|
+
**Program ID:** `Hy8HdxYZrPbAdMgMkL9ZVdJDNesZrihUVQLjoT16jacV`
|
|
16
|
+
This client is generated from that program’s IDL — keep program deploy and SDK version in lockstep.
|
|
17
|
+
|
|
18
|
+
## Entry points
|
|
19
|
+
|
|
20
|
+
| Import | Audience |
|
|
21
|
+
|--------|----------|
|
|
22
|
+
| `phygital-payment-sdk` | Merchant terminal, payer wallet, arbiter UI (browser-safe) |
|
|
23
|
+
| `phygital-payment-sdk/server` | Payment provider (Node only — enabler co-sign, fee sponsor, stores, keeper, indexer) |
|
|
24
|
+
| `phygital-payment-sdk/codama` | Raw Codama instruction builders (unstable) |
|
|
25
|
+
|
|
26
|
+
Role guides (source of truth):
|
|
27
|
+
[merchant](https://github.com/jychab/phygital-payment/blob/master/docs/merchant.md) ·
|
|
28
|
+
[payer](https://github.com/jychab/phygital-payment/blob/master/docs/payer.md) ·
|
|
29
|
+
[arbiter](https://github.com/jychab/phygital-payment/blob/master/docs/arbiter.md) ·
|
|
30
|
+
[provider](https://github.com/jychab/phygital-payment/blob/master/docs/provider.md) ·
|
|
31
|
+
[security](https://github.com/jychab/phygital-payment/blob/master/docs/security.md)
|
|
32
|
+
|
|
33
|
+
## Merchant — take a payment
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { createMerchantClient, createProviderTransport } from "phygital-payment-sdk";
|
|
37
|
+
|
|
38
|
+
const merchant = createMerchantClient({
|
|
39
|
+
rpc, rpcSubscriptions,
|
|
40
|
+
merchant: treasury, // wallet, PDA, or multisig vault
|
|
41
|
+
treasurySigner, // only for refund / respond / operators
|
|
42
|
+
provider: createProviderTransport({ baseUrl: "https://provider.example", apiKey }),
|
|
43
|
+
// allowDeferral: false, // opt out of deferred settlement (zero credit risk)
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const result = await merchant.charge({
|
|
47
|
+
amount: 4_500_000n,
|
|
48
|
+
mint: usdcMint,
|
|
49
|
+
acceptArbiter: ({ reputation }) => (reputation?.score ?? 0) >= 0.9,
|
|
50
|
+
onProgress: (e) => render(e), // awaitingTap → … → confirmed | queued
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Payer — wallet setup
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { createWalletClient } from "phygital-payment-sdk";
|
|
58
|
+
|
|
59
|
+
const wallet = createWalletClient({ rpc, rpcSubscriptions, owner });
|
|
60
|
+
await wallet.setup({
|
|
61
|
+
mint: usdcMint, enablerPubkey, credential: { credentialId },
|
|
62
|
+
maxTapAmount: 100_000_000n, // mandatory (fail-closed ceiling)
|
|
63
|
+
approvedArbiter, // mandatory (registered Arbiter)
|
|
64
|
+
reserve: 50_000_000n, // optional withdrawal floor
|
|
65
|
+
});
|
|
66
|
+
await wallet.deposit({ mint: usdcMint, amount: 100_000_000n });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Arbiter — resolve disputes
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { createArbiterClient } from "phygital-payment-sdk";
|
|
73
|
+
|
|
74
|
+
const arbiter = createArbiterClient({ rpc, arbiter: arbiterSigner, store: indexerStore });
|
|
75
|
+
await arbiter.register();
|
|
76
|
+
const open = await arbiter.listOpenDisputes();
|
|
77
|
+
await arbiter.resolveForPayer(open[0]!.address); // or resolveForMerchant / resolve({ merchantAmount })
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Provider — backend
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import {
|
|
84
|
+
createEnablerService, createFeePayerService, createProviderRouter,
|
|
85
|
+
createEventIndexer, createKeeper,
|
|
86
|
+
createInMemoryReferenceStore, createInMemoryExposureStore,
|
|
87
|
+
createInMemoryIndexerStore, createInMemoryPendingTapStore,
|
|
88
|
+
} from "phygital-payment-sdk/server";
|
|
89
|
+
|
|
90
|
+
const exposureStore = createInMemoryExposureStore(); // replace with Redis/Postgres in production
|
|
91
|
+
const enabler = createEnablerService({
|
|
92
|
+
rpc, signer, // HSM-backed EnablerSigner in production
|
|
93
|
+
replayStore: createInMemoryReferenceStore(), // REQUIRED
|
|
94
|
+
exposureStore, // REQUIRED — atomic tryReserve
|
|
95
|
+
expectedOrigins: "https://pos.example",
|
|
96
|
+
expectedRPID: "pos.example",
|
|
97
|
+
policy: { maxAmountPerTap: 100_000_000n },
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const indexer = createEventIndexer({
|
|
101
|
+
rpc, rpcSubscriptions,
|
|
102
|
+
store: createInMemoryIndexerStore(),
|
|
103
|
+
exposureStore,
|
|
104
|
+
});
|
|
105
|
+
indexer.subscribe();
|
|
106
|
+
|
|
107
|
+
const handle = createProviderRouter({
|
|
108
|
+
enabler,
|
|
109
|
+
feePayer: createFeePayerService(feePayerKeypair, { maxPriorityFeeLamports: 100_000n }),
|
|
110
|
+
pendingTaps: createInMemoryPendingTapStore(),
|
|
111
|
+
verifyApiKey: (key) => key === process.env.API_KEY,
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Also run settlement/close cranks (`createKeeper`) with the **same** ed25519 key as the fee payer.
|
|
116
|
+
See the [provider guide](https://github.com/jychab/phygital-payment/blob/master/docs/provider.md).
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
ISC — see the [repository](https://github.com/jychab/phygital-payment).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Address, RpcSubscriptions, Signature, SolanaRpcSubscriptionsApi, TransactionSigner } from "@solana/kit";
|
|
2
|
+
import { type ArbiterReputation, type PaymentSummary, type SdkRpc } from "../core/payment.js";
|
|
3
|
+
import type { IndexedPayment, IndexerStore } from "../core/indexer-store.js";
|
|
4
|
+
export interface ArbiterClientConfig {
|
|
5
|
+
rpc: SdkRpc;
|
|
6
|
+
rpcSubscriptions?: RpcSubscriptions<SolanaRpcSubscriptionsApi>;
|
|
7
|
+
arbiter: TransactionSigner;
|
|
8
|
+
store?: IndexerStore;
|
|
9
|
+
}
|
|
10
|
+
export interface ArbiterClient {
|
|
11
|
+
resolve(params: {
|
|
12
|
+
payment: Address;
|
|
13
|
+
merchantAmount: bigint;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
signature: Signature;
|
|
16
|
+
}>;
|
|
17
|
+
resolveForMerchant(payment: Address): Promise<{
|
|
18
|
+
signature: Signature;
|
|
19
|
+
}>;
|
|
20
|
+
resolveForPayer(payment: Address): Promise<{
|
|
21
|
+
signature: Signature;
|
|
22
|
+
}>;
|
|
23
|
+
register(): Promise<{
|
|
24
|
+
signature?: Signature;
|
|
25
|
+
alreadyRegistered: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
reputation(): Promise<ArbiterReputation | null>;
|
|
28
|
+
listOpenDisputes(options?: {
|
|
29
|
+
limit?: number;
|
|
30
|
+
}): Promise<IndexedPayment[]>;
|
|
31
|
+
getDispute(payment: Address): Promise<PaymentSummary | null>;
|
|
32
|
+
}
|
|
33
|
+
export declare function createArbiterClient(config: ArbiterClientConfig): ArbiterClient;
|
|
34
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/arbiter/client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EAEP,gBAAgB,EAChB,SAAS,EACT,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;IAE/D,OAAO,EAAE,iBAAiB,CAAC;IAK3B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAM5B,OAAO,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAGtC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAGxE,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAOrE,QAAQ,IAAI,OAAO,CAAC;QAAE,SAAS,CAAC,EAAE,SAAS,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAG3E,UAAU,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAGhD,gBAAgB,CAAC,OAAO,CAAC,EAAE;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAG9B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC9D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAkIf"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { getCreateAssociatedTokenIdempotentInstructionAsync } from "@solana-program/token";
|
|
2
|
+
import { getResolveDisputeInstruction } from "../generated/instructions/resolveDispute.js";
|
|
3
|
+
import { getRegisterArbiterInstructionAsync } from "../generated/instructions/registerArbiter.js";
|
|
4
|
+
import { ConfigurationError, InvalidAmountError } from "../core/errors.js";
|
|
5
|
+
import { fetchArbiterReputation, fetchPaymentSummary, } from "../core/payment.js";
|
|
6
|
+
import { deriveArbiterAddress, deriveAssociatedTokenAddress, deriveEscrowAddress, derivePaymentAccountAddress, } from "../core/pda.js";
|
|
7
|
+
import { PaymentStatus } from "../core/status.js";
|
|
8
|
+
import { createTransactionRuntime } from "../core/transactions.js";
|
|
9
|
+
export function createArbiterClient(config) {
|
|
10
|
+
const runtime = createTransactionRuntime(config);
|
|
11
|
+
async function fetchDisputedOrThrow(payment) {
|
|
12
|
+
const summary = await fetchPaymentSummary(config.rpc, payment);
|
|
13
|
+
if (!summary) {
|
|
14
|
+
throw new ConfigurationError(`Payment ${payment} does not exist on-chain. It may have already been resolved (which closes the account).`);
|
|
15
|
+
}
|
|
16
|
+
if (summary.status !== PaymentStatus.Disputed) {
|
|
17
|
+
throw new ConfigurationError(`Payment ${payment} is not Disputed (status=${summary.status}).`);
|
|
18
|
+
}
|
|
19
|
+
if (summary.arbiter !== config.arbiter.address) {
|
|
20
|
+
throw new ConfigurationError(`Payment ${payment} is assigned to arbiter ${summary.arbiter}, not ${config.arbiter.address}.`);
|
|
21
|
+
}
|
|
22
|
+
return summary;
|
|
23
|
+
}
|
|
24
|
+
async function resolve(params) {
|
|
25
|
+
const summary = await fetchDisputedOrThrow(params.payment);
|
|
26
|
+
if (params.merchantAmount < 0n || params.merchantAmount > summary.amount) {
|
|
27
|
+
throw new InvalidAmountError(`merchantAmount ${params.merchantAmount} must be within [0, ${summary.amount}].`);
|
|
28
|
+
}
|
|
29
|
+
const paymentAccount = await derivePaymentAccountAddress({
|
|
30
|
+
owner: summary.payer,
|
|
31
|
+
mint: summary.mint,
|
|
32
|
+
tokenProgram: summary.tokenProgram,
|
|
33
|
+
});
|
|
34
|
+
const escrowTokenAccount = await deriveEscrowAddress({
|
|
35
|
+
owner: summary.payer,
|
|
36
|
+
mint: summary.mint,
|
|
37
|
+
tokenProgram: summary.tokenProgram,
|
|
38
|
+
});
|
|
39
|
+
const merchantTokenAccount = await deriveAssociatedTokenAddress({
|
|
40
|
+
owner: summary.merchant,
|
|
41
|
+
mint: summary.mint,
|
|
42
|
+
tokenProgram: summary.tokenProgram,
|
|
43
|
+
});
|
|
44
|
+
const arbiterAccount = await deriveArbiterAddress(summary.arbiter);
|
|
45
|
+
const instructions = [
|
|
46
|
+
await getCreateAssociatedTokenIdempotentInstructionAsync({
|
|
47
|
+
payer: config.arbiter,
|
|
48
|
+
owner: summary.merchant,
|
|
49
|
+
mint: summary.mint,
|
|
50
|
+
tokenProgram: summary.tokenProgram,
|
|
51
|
+
}),
|
|
52
|
+
getResolveDisputeInstruction({
|
|
53
|
+
arbiter: config.arbiter,
|
|
54
|
+
paymentAccount,
|
|
55
|
+
payment: params.payment,
|
|
56
|
+
arbiterAccount,
|
|
57
|
+
escrowTokenAccount,
|
|
58
|
+
mint: summary.mint,
|
|
59
|
+
merchantTokenAccount,
|
|
60
|
+
tokenProgram: summary.tokenProgram,
|
|
61
|
+
merchantAmount: params.merchantAmount,
|
|
62
|
+
}),
|
|
63
|
+
];
|
|
64
|
+
const signature = await runtime.sendAndConfirm(config.arbiter, instructions);
|
|
65
|
+
await config.store?.remove(params.payment);
|
|
66
|
+
return { signature };
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
resolve,
|
|
70
|
+
async register() {
|
|
71
|
+
const existing = await fetchArbiterReputation(config.rpc, config.arbiter.address);
|
|
72
|
+
if (existing)
|
|
73
|
+
return { alreadyRegistered: true };
|
|
74
|
+
const instruction = await getRegisterArbiterInstructionAsync({
|
|
75
|
+
authority: config.arbiter,
|
|
76
|
+
});
|
|
77
|
+
const signature = await runtime.sendAndConfirm(config.arbiter, [
|
|
78
|
+
instruction,
|
|
79
|
+
]);
|
|
80
|
+
return { signature, alreadyRegistered: false };
|
|
81
|
+
},
|
|
82
|
+
reputation() {
|
|
83
|
+
return fetchArbiterReputation(config.rpc, config.arbiter.address);
|
|
84
|
+
},
|
|
85
|
+
resolveForMerchant(payment) {
|
|
86
|
+
return fetchDisputedOrThrow(payment).then((summary) => resolve({ payment, merchantAmount: summary.amount }));
|
|
87
|
+
},
|
|
88
|
+
resolveForPayer(payment) {
|
|
89
|
+
return resolve({ payment, merchantAmount: 0n });
|
|
90
|
+
},
|
|
91
|
+
async listOpenDisputes(options = {}) {
|
|
92
|
+
if (!config.store) {
|
|
93
|
+
throw new ConfigurationError("listOpenDisputes requires an IndexerStore. Pass `store` to createArbiterClient, fed by createEventIndexer.");
|
|
94
|
+
}
|
|
95
|
+
return config.store.list({
|
|
96
|
+
status: PaymentStatus.Disputed,
|
|
97
|
+
arbiter: config.arbiter.address,
|
|
98
|
+
limit: options.limit,
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
getDispute(payment) {
|
|
102
|
+
return fetchPaymentSummary(config.rpc, payment);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/arbiter/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amounts.d.ts","sourceRoot":"","sources":["../../src/core/amounts.ts"],"names":[],"mappings":"AASA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM9C;AAMD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB7E;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUtE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { InvalidAmountError } from "./errors.js";
|
|
2
|
+
const U64_MAX = 18446744073709551615n;
|
|
3
|
+
export function assertU64(amount) {
|
|
4
|
+
if (amount < 0n || amount > U64_MAX) {
|
|
5
|
+
throw new InvalidAmountError(`Amount ${amount} is outside the valid u64 range.`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function toBaseUnits(amount, decimals) {
|
|
9
|
+
const text = typeof amount === "number" ? String(amount) : amount.trim();
|
|
10
|
+
const match = /^([0-9]+)(?:\.([0-9]*))?$/.exec(text);
|
|
11
|
+
if (!match) {
|
|
12
|
+
throw new InvalidAmountError(`Cannot parse amount "${amount}".`);
|
|
13
|
+
}
|
|
14
|
+
const whole = match[1];
|
|
15
|
+
const fraction = match[2] ?? "";
|
|
16
|
+
if (fraction.length > decimals) {
|
|
17
|
+
throw new InvalidAmountError(`Amount "${amount}" has more than ${decimals} decimal places.`);
|
|
18
|
+
}
|
|
19
|
+
const base = BigInt(whole) * 10n ** BigInt(decimals) +
|
|
20
|
+
BigInt(fraction.padEnd(decimals, "0") || "0");
|
|
21
|
+
assertU64(base);
|
|
22
|
+
return base;
|
|
23
|
+
}
|
|
24
|
+
export function fromBaseUnits(amount, decimals) {
|
|
25
|
+
assertU64(amount);
|
|
26
|
+
if (decimals === 0)
|
|
27
|
+
return amount.toString();
|
|
28
|
+
const divisor = 10n ** BigInt(decimals);
|
|
29
|
+
const whole = amount / divisor;
|
|
30
|
+
const fraction = (amount % divisor)
|
|
31
|
+
.toString()
|
|
32
|
+
.padStart(decimals, "0")
|
|
33
|
+
.replace(/0+$/, "");
|
|
34
|
+
return fraction.length > 0 ? `${whole}.${fraction}` : whole.toString();
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=amounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amounts.js","sourceRoot":"","sources":["../../src/core/amounts.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,OAAO,GAAG,qBAA2B,CAAC;AAG5C,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,kBAAkB,CAC1B,UAAU,MAAM,kCAAkC,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,WAAW,CAAC,MAAuB,EAAE,QAAgB;IACnE,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,MAAM,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,kBAAkB,CAC1B,WAAW,MAAM,mBAAmB,QAAQ,kBAAkB,CAC/D,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC5D,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;SAChC,QAAQ,EAAE;SACV,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function concatBytes(...parts: readonly Uint8Array[]): Uint8Array;
|
|
2
|
+
export declare function bytesToBase58(bytes: Uint8Array): string;
|
|
3
|
+
export declare function base58ToBytes(value: string): Uint8Array;
|
|
4
|
+
export declare function bytesToBase64Url(bytes: Uint8Array): string;
|
|
5
|
+
export declare function base64UrlToBytes(value: string): Uint8Array;
|
|
6
|
+
export declare function bytesToBase64(bytes: Uint8Array): string;
|
|
7
|
+
export declare function base64ToBytes(value: string): Uint8Array;
|
|
8
|
+
export declare function randomReference(): Uint8Array;
|
|
9
|
+
export declare function bytesEqualConstant(a: Uint8Array, b: Uint8Array): boolean;
|
|
10
|
+
export declare function toUint8Array(bytes: ArrayLike<number>): Uint8Array;
|
|
11
|
+
//# sourceMappingURL=bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/core/bytes.ts"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CASvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAU1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAK1D;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASvD;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAUvD;AAGD,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAOxE;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAEjE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { getBase58Decoder, getBase58Encoder } from "@solana/kit";
|
|
2
|
+
export function concatBytes(...parts) {
|
|
3
|
+
const total = parts.reduce((sum, part) => sum + part.length, 0);
|
|
4
|
+
const out = new Uint8Array(total);
|
|
5
|
+
let offset = 0;
|
|
6
|
+
for (const part of parts) {
|
|
7
|
+
out.set(part, offset);
|
|
8
|
+
offset += part.length;
|
|
9
|
+
}
|
|
10
|
+
return out;
|
|
11
|
+
}
|
|
12
|
+
export function bytesToBase58(bytes) {
|
|
13
|
+
return getBase58Decoder().decode(bytes);
|
|
14
|
+
}
|
|
15
|
+
export function base58ToBytes(value) {
|
|
16
|
+
return new Uint8Array(getBase58Encoder().encode(value));
|
|
17
|
+
}
|
|
18
|
+
export function bytesToBase64Url(bytes) {
|
|
19
|
+
let binary = "";
|
|
20
|
+
for (const byte of bytes) {
|
|
21
|
+
binary += String.fromCharCode(byte);
|
|
22
|
+
}
|
|
23
|
+
const base64 = typeof btoa === "function"
|
|
24
|
+
? btoa(binary)
|
|
25
|
+
: Buffer.from(bytes).toString("base64");
|
|
26
|
+
return base64.replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
|
|
27
|
+
}
|
|
28
|
+
export function base64UrlToBytes(value) {
|
|
29
|
+
const base64 = value.replaceAll("-", "+").replaceAll("_", "/") +
|
|
30
|
+
"=".repeat((4 - (value.length % 4)) % 4);
|
|
31
|
+
return base64ToBytes(base64);
|
|
32
|
+
}
|
|
33
|
+
export function bytesToBase64(bytes) {
|
|
34
|
+
if (typeof Buffer !== "undefined") {
|
|
35
|
+
return Buffer.from(bytes).toString("base64");
|
|
36
|
+
}
|
|
37
|
+
let binary = "";
|
|
38
|
+
for (const byte of bytes) {
|
|
39
|
+
binary += String.fromCharCode(byte);
|
|
40
|
+
}
|
|
41
|
+
return btoa(binary);
|
|
42
|
+
}
|
|
43
|
+
export function base64ToBytes(value) {
|
|
44
|
+
if (typeof Buffer !== "undefined") {
|
|
45
|
+
return new Uint8Array(Buffer.from(value, "base64"));
|
|
46
|
+
}
|
|
47
|
+
const binary = atob(value);
|
|
48
|
+
const out = new Uint8Array(binary.length);
|
|
49
|
+
for (let i = 0; i < binary.length; i++) {
|
|
50
|
+
out[i] = binary.charCodeAt(i);
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
export function randomReference() {
|
|
55
|
+
return crypto.getRandomValues(new Uint8Array(32));
|
|
56
|
+
}
|
|
57
|
+
export function bytesEqualConstant(a, b) {
|
|
58
|
+
if (a.length !== b.length)
|
|
59
|
+
return false;
|
|
60
|
+
let diff = 0;
|
|
61
|
+
for (let i = 0; i < a.length; i++) {
|
|
62
|
+
diff |= a[i] ^ b[i];
|
|
63
|
+
}
|
|
64
|
+
return diff === 0;
|
|
65
|
+
}
|
|
66
|
+
export function toUint8Array(bytes) {
|
|
67
|
+
return Uint8Array.from(bytes);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/core/bytes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Address } from "@solana/kit";
|
|
2
|
+
export interface PaymentAuthorizationFields {
|
|
3
|
+
mint: Address;
|
|
4
|
+
amount: bigint | number;
|
|
5
|
+
merchant: Address;
|
|
6
|
+
programId?: Address;
|
|
7
|
+
}
|
|
8
|
+
export interface TapChallengeFields extends PaymentAuthorizationFields {
|
|
9
|
+
reference: Uint8Array;
|
|
10
|
+
issuedAt: number | bigint;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildPaymentAuthorizationMessage({ mint, amount, merchant, programId, }: PaymentAuthorizationFields): Uint8Array;
|
|
13
|
+
export declare function assertValidReference(reference: Uint8Array): void;
|
|
14
|
+
export declare function buildTapChallenge(fields: TapChallengeFields): Uint8Array;
|
|
15
|
+
//# sourceMappingURL=challenge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/core/challenge.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,0BAA0B;IAEpE,SAAS,EAAE,UAAU,CAAC;IAEtB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAMD,wBAAgB,gCAAgC,CAAC,EAC/C,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,SAA4C,GAC7C,EAAE,0BAA0B,GAAG,UAAU,CAQzC;AAGD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAShE;AAYD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,UAAU,CAWxE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getAddressEncoder, getU64Encoder, } from "@solana/kit";
|
|
2
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
3
|
+
import { PHYGITAL_PAYMENT_PROGRAM_ADDRESS } from "../generated/programs/phygitalPayment.js";
|
|
4
|
+
import { concatBytes } from "./bytes.js";
|
|
5
|
+
import { InvalidReferenceError } from "./errors.js";
|
|
6
|
+
const TAP_CHALLENGE_ACTION_BYTES = new TextEncoder().encode("phygital_pay:tap:v2");
|
|
7
|
+
export function buildPaymentAuthorizationMessage({ mint, amount, merchant, programId = PHYGITAL_PAYMENT_PROGRAM_ADDRESS, }) {
|
|
8
|
+
const addressEncoder = getAddressEncoder();
|
|
9
|
+
return concatBytes(new Uint8Array(addressEncoder.encode(programId)), new Uint8Array(addressEncoder.encode(mint)), new Uint8Array(getU64Encoder().encode(amount)), new Uint8Array(addressEncoder.encode(merchant)));
|
|
10
|
+
}
|
|
11
|
+
export function assertValidReference(reference) {
|
|
12
|
+
if (reference.length !== 32) {
|
|
13
|
+
throw new InvalidReferenceError(`Payment reference must be exactly 32 bytes, got ${reference.length}.`);
|
|
14
|
+
}
|
|
15
|
+
if (reference.every((byte) => byte === 0)) {
|
|
16
|
+
throw new InvalidReferenceError("Payment reference must be non-zero.");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function buildTapChallenge(fields) {
|
|
20
|
+
assertValidReference(fields.reference);
|
|
21
|
+
const messageHash = sha256(buildPaymentAuthorizationMessage(fields));
|
|
22
|
+
return sha256(concatBytes(TAP_CHALLENGE_ACTION_BYTES, messageHash, fields.reference, new Uint8Array(getU64Encoder().encode(fields.issuedAt))));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=challenge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/core/challenge.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,iBAAiB,EACjB,aAAa,GAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,0BAA0B,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CACzD,qBAAqB,CACtB,CAAC;AAoBF,MAAM,UAAU,gCAAgC,CAAC,EAC/C,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,gCAAgC,GACjB;IAC3B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,OAAO,WAAW,CAChB,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAChD,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAC3C,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC9C,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,SAAqB;IACxD,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,qBAAqB,CAC7B,mDAAmD,SAAS,CAAC,MAAM,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,qBAAqB,CAAC,qCAAqC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,iBAAiB,CAAC,MAA0B;IAC1D,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,CACX,WAAW,CACT,0BAA0B,EAC1B,WAAW,EACX,MAAM,CAAC,SAAS,EAChB,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CACxD,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Signature } from "@solana/kit";
|
|
2
|
+
export declare abstract class PhygitalPaymentSdkError extends Error {
|
|
3
|
+
abstract readonly code: string;
|
|
4
|
+
constructor(message: string, options?: {
|
|
5
|
+
cause?: unknown;
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export declare function programErrorName(errorCode: number): string;
|
|
9
|
+
export declare class ProgramExecutionError extends PhygitalPaymentSdkError {
|
|
10
|
+
readonly code = "program_error";
|
|
11
|
+
readonly errorCode: number;
|
|
12
|
+
readonly errorName: string;
|
|
13
|
+
readonly signature?: Signature;
|
|
14
|
+
readonly logs?: readonly string[];
|
|
15
|
+
constructor(errorCode: number, ctx?: {
|
|
16
|
+
signature?: Signature;
|
|
17
|
+
logs?: readonly string[];
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export declare class SimulationError extends PhygitalPaymentSdkError {
|
|
22
|
+
readonly code = "simulation_failed";
|
|
23
|
+
readonly transactionError: unknown;
|
|
24
|
+
readonly logs?: readonly string[];
|
|
25
|
+
constructor(transactionError: unknown, ctx?: {
|
|
26
|
+
logs?: readonly string[];
|
|
27
|
+
cause?: unknown;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export declare class ProviderHttpError extends PhygitalPaymentSdkError {
|
|
31
|
+
readonly code = "provider_http_error";
|
|
32
|
+
readonly endpoint: "getEnablerSignature" | "listPendingTaps" | "acknowledgePendingTap" | "persistTransferResult" | "getFeePayer" | "signAsFeePayer";
|
|
33
|
+
readonly status: number;
|
|
34
|
+
readonly body?: string;
|
|
35
|
+
constructor(endpoint: ProviderHttpError["endpoint"], status: number, body?: string, options?: {
|
|
36
|
+
cause?: unknown;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export declare class TapReadError extends PhygitalPaymentSdkError {
|
|
40
|
+
readonly code = "tap_read_failed";
|
|
41
|
+
readonly aborted: boolean;
|
|
42
|
+
constructor(message: string, ctx?: {
|
|
43
|
+
aborted?: boolean;
|
|
44
|
+
cause?: unknown;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export declare class EnablerMismatchError extends PhygitalPaymentSdkError {
|
|
48
|
+
readonly code = "enabler_mismatch";
|
|
49
|
+
readonly expected: Uint8Array;
|
|
50
|
+
readonly actual: Uint8Array;
|
|
51
|
+
constructor(expected: Uint8Array, actual: Uint8Array);
|
|
52
|
+
}
|
|
53
|
+
export declare class PolicyViolationError extends PhygitalPaymentSdkError {
|
|
54
|
+
readonly code = "policy_violation";
|
|
55
|
+
readonly rule: string;
|
|
56
|
+
readonly detail?: string;
|
|
57
|
+
constructor(rule: string, detail?: string);
|
|
58
|
+
}
|
|
59
|
+
export declare class EnvironmentError extends PhygitalPaymentSdkError {
|
|
60
|
+
readonly code = "wrong_environment";
|
|
61
|
+
}
|
|
62
|
+
export declare class InvalidReferenceError extends PhygitalPaymentSdkError {
|
|
63
|
+
readonly code = "invalid_reference";
|
|
64
|
+
}
|
|
65
|
+
export declare class ConfigurationError extends PhygitalPaymentSdkError {
|
|
66
|
+
readonly code = "configuration_error";
|
|
67
|
+
}
|
|
68
|
+
export declare class InvalidAmountError extends PhygitalPaymentSdkError {
|
|
69
|
+
readonly code = "invalid_amount";
|
|
70
|
+
}
|
|
71
|
+
export declare class TapLimitError extends PhygitalPaymentSdkError {
|
|
72
|
+
readonly code = "tap_limit_exceeded";
|
|
73
|
+
readonly amount: bigint;
|
|
74
|
+
readonly limit: bigint;
|
|
75
|
+
constructor(amount: bigint, limit: bigint);
|
|
76
|
+
}
|
|
77
|
+
export declare class ArbiterNotApprovedError extends PhygitalPaymentSdkError {
|
|
78
|
+
readonly code = "arbiter_not_approved";
|
|
79
|
+
}
|
|
80
|
+
export declare class ArbiterRejectedError extends PhygitalPaymentSdkError {
|
|
81
|
+
readonly code = "arbiter_rejected";
|
|
82
|
+
readonly arbiter: string;
|
|
83
|
+
constructor(arbiter: string, detail?: string);
|
|
84
|
+
}
|
|
85
|
+
export declare function extractCustomErrorCode(transactionError: unknown): number | null;
|
|
86
|
+
export declare function toSdkError(error: unknown, ctx?: {
|
|
87
|
+
signature?: Signature;
|
|
88
|
+
logs?: readonly string[];
|
|
89
|
+
}): PhygitalPaymentSdkError;
|
|
90
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|