@solana/mpp 0.0.0 → 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/Methods.d.ts +272 -0
- package/dist/Methods.d.ts.map +1 -0
- package/dist/Methods.js +217 -0
- package/dist/Methods.js.map +1 -0
- package/dist/client/Charge.d.ts +112 -0
- package/dist/client/Charge.d.ts.map +1 -0
- package/dist/client/Charge.js +216 -0
- package/dist/client/Charge.js.map +1 -0
- package/dist/client/Methods.d.ts +27 -0
- package/dist/client/Methods.d.ts.map +1 -0
- package/dist/client/Methods.js +23 -0
- package/dist/client/Methods.js.map +1 -0
- package/dist/client/Session.d.ts +195 -0
- package/dist/client/Session.d.ts.map +1 -0
- package/dist/client/Session.js +411 -0
- package/dist/client/Session.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/server/Charge.d.ts +103 -0
- package/dist/server/Charge.d.ts.map +1 -0
- package/dist/server/Charge.js +318 -0
- package/dist/server/Charge.js.map +1 -0
- package/dist/server/Methods.d.ts +23 -0
- package/dist/server/Methods.d.ts.map +1 -0
- package/dist/server/Methods.js +19 -0
- package/dist/server/Methods.js.map +1 -0
- package/dist/server/Session.d.ts +171 -0
- package/dist/server/Session.d.ts.map +1 -0
- package/dist/server/Session.js +430 -0
- package/dist/server/Session.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -0
- package/dist/session/ChannelStore.d.ts +12 -0
- package/dist/session/ChannelStore.d.ts.map +1 -0
- package/dist/session/ChannelStore.js +88 -0
- package/dist/session/ChannelStore.js.map +1 -0
- package/dist/session/Types.d.ts +179 -0
- package/dist/session/Types.d.ts.map +1 -0
- package/dist/session/Types.js +2 -0
- package/dist/session/Types.js.map +1 -0
- package/dist/session/Voucher.d.ts +7 -0
- package/dist/session/Voucher.d.ts.map +1 -0
- package/dist/session/Voucher.js +118 -0
- package/dist/session/Voucher.js.map +1 -0
- package/dist/session/authorizers/BudgetAuthorizer.d.ts +90 -0
- package/dist/session/authorizers/BudgetAuthorizer.d.ts.map +1 -0
- package/dist/session/authorizers/BudgetAuthorizer.js +398 -0
- package/dist/session/authorizers/BudgetAuthorizer.js.map +1 -0
- package/dist/session/authorizers/SwigSessionAuthorizer.d.ts +104 -0
- package/dist/session/authorizers/SwigSessionAuthorizer.d.ts.map +1 -0
- package/dist/session/authorizers/SwigSessionAuthorizer.js +522 -0
- package/dist/session/authorizers/SwigSessionAuthorizer.js.map +1 -0
- package/dist/session/authorizers/UnboundedAuthorizer.d.ts +36 -0
- package/dist/session/authorizers/UnboundedAuthorizer.d.ts.map +1 -0
- package/dist/session/authorizers/UnboundedAuthorizer.js +204 -0
- package/dist/session/authorizers/UnboundedAuthorizer.js.map +1 -0
- package/dist/session/authorizers/index.d.ts +5 -0
- package/dist/session/authorizers/index.d.ts.map +1 -0
- package/dist/session/authorizers/index.js +5 -0
- package/dist/session/authorizers/index.js.map +1 -0
- package/dist/session/authorizers/makeSessionAuthorizer.d.ts +19 -0
- package/dist/session/authorizers/makeSessionAuthorizer.d.ts.map +1 -0
- package/dist/session/authorizers/makeSessionAuthorizer.js +72 -0
- package/dist/session/authorizers/makeSessionAuthorizer.js.map +1 -0
- package/dist/session/index.d.ts +5 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +5 -0
- package/dist/session/index.js.map +1 -0
- package/dist/utils/transactions.d.ts +11 -0
- package/dist/utils/transactions.d.ts.map +1 -0
- package/dist/utils/transactions.js +16 -0
- package/dist/utils/transactions.js.map +1 -0
- package/package.json +75 -8
- package/sdk/src/Methods.ts +230 -0
- package/sdk/src/client/Charge.ts +353 -0
- package/sdk/src/client/Methods.ts +31 -0
- package/sdk/src/client/Session.ts +630 -0
- package/sdk/src/client/index.ts +5 -0
- package/sdk/src/constants.ts +15 -0
- package/sdk/src/index.ts +35 -0
- package/sdk/src/server/Charge.ts +484 -0
- package/sdk/src/server/Methods.ts +27 -0
- package/sdk/src/server/Session.ts +687 -0
- package/sdk/src/server/index.ts +5 -0
- package/sdk/src/session/ChannelStore.ts +128 -0
- package/sdk/src/session/Types.ts +189 -0
- package/sdk/src/session/Voucher.ts +158 -0
- package/sdk/src/session/authorizers/BudgetAuthorizer.ts +574 -0
- package/sdk/src/session/authorizers/SwigSessionAuthorizer.ts +767 -0
- package/sdk/src/session/authorizers/UnboundedAuthorizer.ts +284 -0
- package/sdk/src/session/authorizers/index.ts +4 -0
- package/sdk/src/session/authorizers/makeSessionAuthorizer.ts +104 -0
- package/sdk/src/session/index.ts +4 -0
- package/sdk/src/utils/transactions.ts +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../sdk/src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,gDAAgD,CAAC;AAC3E,eAAO,MAAM,kBAAkB,gDAAgD,CAAC;AAChF,eAAO,MAAM,wBAAwB,iDAAiD,CAAC;AACvF,eAAO,MAAM,cAAc,qCAAqC,CAAC;AAEjE,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAInD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const TOKEN_PROGRAM = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';
|
|
2
|
+
export const TOKEN_2022_PROGRAM = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
|
|
3
|
+
export const ASSOCIATED_TOKEN_PROGRAM = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';
|
|
4
|
+
export const SYSTEM_PROGRAM = '11111111111111111111111111111111';
|
|
5
|
+
export const USDC = {
|
|
6
|
+
devnet: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',
|
|
7
|
+
'mainnet-beta': 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
|
|
8
|
+
};
|
|
9
|
+
export const DEFAULT_RPC_URLS = {
|
|
10
|
+
devnet: 'https://api.devnet.solana.com',
|
|
11
|
+
localnet: 'http://localhost:8899',
|
|
12
|
+
'mainnet-beta': 'https://api.mainnet-beta.solana.com',
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../sdk/src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,6CAA6C,CAAC;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,6CAA6C,CAAC;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,8CAA8C,CAAC;AACvF,MAAM,CAAC,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAEjE,MAAM,CAAC,MAAM,IAAI,GAA2B;IACxC,MAAM,EAAE,8CAA8C;IACtD,cAAc,EAAE,8CAA8C;CACjE,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACpD,MAAM,EAAE,+BAA+B;IACvC,QAAQ,EAAE,uBAAuB;IACjC,cAAc,EAAE,qCAAqC;CACxD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { charge } from './Methods.js';
|
|
2
|
+
export { session } from './Methods.js';
|
|
3
|
+
export type { AuthorizationMode, SessionVoucher, SignedSessionVoucher, ChannelState, SessionCredentialPayload, VoucherVerifier, SessionAuthorizer, AuthorizeOpenInput, AuthorizedOpen, AuthorizeUpdateInput, AuthorizedUpdate, AuthorizeTopupInput, AuthorizedTopup, AuthorizeCloseInput, AuthorizedClose, AuthorizerCapabilities, SessionPolicyProfile, } from './session/Types.js';
|
|
4
|
+
export { BudgetAuthorizer, SwigSessionAuthorizer, UnboundedAuthorizer, makeSessionAuthorizer, } from './session/authorizers/index.js';
|
|
5
|
+
export * as server from './server/index.js';
|
|
6
|
+
export * as client from './client/index.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sdk/src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,YAAY,EACR,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Shared types and method definition
|
|
2
|
+
export { charge } from './Methods.js';
|
|
3
|
+
export { session } from './Methods.js';
|
|
4
|
+
export { BudgetAuthorizer, SwigSessionAuthorizer, UnboundedAuthorizer, makeSessionAuthorizer, } from './session/authorizers/index.js';
|
|
5
|
+
// Convenience re-exports — for full usage, import from solana-mpp-sdk/server or solana-mpp-sdk/client
|
|
6
|
+
export * as server from './server/index.js';
|
|
7
|
+
export * as client from './client/index.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../sdk/src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBvC,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,gCAAgC,CAAC;AAExC,sGAAsG;AACtG,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { type TransactionPartialSigner } from '@solana/kit';
|
|
2
|
+
import { Method, Store } from 'mppx';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a Solana `charge` method for usage on the server.
|
|
5
|
+
*
|
|
6
|
+
* Supports two settlement modes:
|
|
7
|
+
*
|
|
8
|
+
* - **Pull mode** (`type="transaction"`, default): The server receives a
|
|
9
|
+
* signed transaction from the client, broadcasts it to Solana, confirms
|
|
10
|
+
* it, and verifies the transfer on-chain. When `signer` is provided,
|
|
11
|
+
* the server co-signs as fee payer before broadcasting.
|
|
12
|
+
*
|
|
13
|
+
* - **Push mode** (`type="signature"`): The client has already broadcast
|
|
14
|
+
* and confirmed the transaction. The server verifies the transfer
|
|
15
|
+
* on-chain using the signature.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { Mppx, solana } from 'solana-mpp-sdk/server'
|
|
20
|
+
*
|
|
21
|
+
* const mppx = Mppx.create({
|
|
22
|
+
* methods: [solana.charge({
|
|
23
|
+
* recipient: 'RecipientPubkey...',
|
|
24
|
+
* splToken: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
|
|
25
|
+
* decimals: 6,
|
|
26
|
+
* network: 'devnet',
|
|
27
|
+
* })],
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* export async function handler(request: Request) {
|
|
31
|
+
* const result = await mppx.charge({ amount: '1000000', currency: 'USDC' })(request)
|
|
32
|
+
* if (result.status === 402) return result.challenge
|
|
33
|
+
* return result.withReceipt(Response.json({ data: '...' }))
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function charge(parameters: charge.Parameters): Method.Server<{
|
|
38
|
+
readonly intent: "charge";
|
|
39
|
+
readonly name: "solana";
|
|
40
|
+
readonly schema: {
|
|
41
|
+
readonly credential: {
|
|
42
|
+
readonly payload: import("zod/mini").ZodMiniObject<{
|
|
43
|
+
signature: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
44
|
+
transaction: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
45
|
+
type: import("zod/mini").ZodMiniString<string>;
|
|
46
|
+
}, import("zod/v4/core").$strip>;
|
|
47
|
+
};
|
|
48
|
+
readonly request: import("zod/mini").ZodMiniObject<{
|
|
49
|
+
amount: import("zod/mini").ZodMiniString<string>;
|
|
50
|
+
currency: import("zod/mini").ZodMiniString<string>;
|
|
51
|
+
description: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
52
|
+
externalId: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
53
|
+
methodDetails: import("zod/mini").ZodMiniObject<{
|
|
54
|
+
decimals: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNumber<number>>;
|
|
55
|
+
feePayer: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniBoolean<boolean>>;
|
|
56
|
+
feePayerKey: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
57
|
+
network: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
58
|
+
recentBlockhash: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
59
|
+
reference: import("zod/mini").ZodMiniString<string>;
|
|
60
|
+
splToken: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
61
|
+
tokenProgram: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
62
|
+
}, import("zod/v4/core").$strip>;
|
|
63
|
+
recipient: import("zod/mini").ZodMiniString<string>;
|
|
64
|
+
}, import("zod/v4/core").$strip>;
|
|
65
|
+
};
|
|
66
|
+
}, {
|
|
67
|
+
readonly currency: "token" | "SOL";
|
|
68
|
+
readonly methodDetails: {
|
|
69
|
+
readonly reference: "";
|
|
70
|
+
};
|
|
71
|
+
readonly recipient: "";
|
|
72
|
+
}, undefined>;
|
|
73
|
+
export declare namespace charge {
|
|
74
|
+
type Parameters = {
|
|
75
|
+
/** Token decimals (required when splToken is set). */
|
|
76
|
+
decimals?: number;
|
|
77
|
+
/** Solana network. Defaults to 'mainnet-beta'. */
|
|
78
|
+
network?: 'devnet' | 'localnet' | 'mainnet-beta' | (string & {});
|
|
79
|
+
/** Base58-encoded recipient public key that receives payments. */
|
|
80
|
+
recipient: string;
|
|
81
|
+
/** Custom RPC URL. Defaults to public RPC for the selected network. */
|
|
82
|
+
rpcUrl?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Server-side signer for fee sponsorship (feePayer mode).
|
|
85
|
+
* When provided, the server's public key is included in the challenge
|
|
86
|
+
* as `feePayerKey`, and the server co-signs the transaction as fee payer
|
|
87
|
+
* before broadcasting.
|
|
88
|
+
*
|
|
89
|
+
* Accepts any TransactionPartialSigner — KeyPairSigner, Keychain SolanaSigner, etc.
|
|
90
|
+
*/
|
|
91
|
+
signer?: TransactionPartialSigner;
|
|
92
|
+
/** SPL token mint address. If absent, payments are in native SOL. */
|
|
93
|
+
splToken?: string;
|
|
94
|
+
/**
|
|
95
|
+
* Pluggable key-value store for consumed-signature tracking (replay prevention).
|
|
96
|
+
* Defaults to in-memory. Use a persistent store in production.
|
|
97
|
+
*/
|
|
98
|
+
store?: Store.Store;
|
|
99
|
+
/** Token program address. Defaults to TOKEN_PROGRAM. Set to TOKEN_2022_PROGRAM for Token-2022 mints. */
|
|
100
|
+
tokenProgram?: string;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=Charge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Charge.d.ts","sourceRoot":"","sources":["../../sdk/src/server/Charge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EAAE,MAAM,EAAW,KAAK,EAAE,MAAM,MAAM,CAAC;AAM9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwFnD;AAoUD,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC5B,KAAK,UAAU,GAAG;QACd,sDAAsD;QACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kDAAkD;QAClD,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACjE,kEAAkE;QAClE,SAAS,EAAE,MAAM,CAAC;QAClB,uEAAuE;QACvE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;;;WAOG;QACH,MAAM,CAAC,EAAE,wBAAwB,CAAC;QAClC,qEAAqE;QACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;QACpB,wGAAwG;QACxG,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACL"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { address, isTransactionPartialSigner } from '@solana/kit';
|
|
2
|
+
import { findAssociatedTokenPda } from '@solana-program/token';
|
|
3
|
+
import { Method, Receipt, Store } from 'mppx';
|
|
4
|
+
import { DEFAULT_RPC_URLS, TOKEN_2022_PROGRAM, TOKEN_PROGRAM } from '../constants.js';
|
|
5
|
+
import * as Methods from '../Methods.js';
|
|
6
|
+
import { coSignBase64Transaction } from '../utils/transactions.js';
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Solana `charge` method for usage on the server.
|
|
9
|
+
*
|
|
10
|
+
* Supports two settlement modes:
|
|
11
|
+
*
|
|
12
|
+
* - **Pull mode** (`type="transaction"`, default): The server receives a
|
|
13
|
+
* signed transaction from the client, broadcasts it to Solana, confirms
|
|
14
|
+
* it, and verifies the transfer on-chain. When `signer` is provided,
|
|
15
|
+
* the server co-signs as fee payer before broadcasting.
|
|
16
|
+
*
|
|
17
|
+
* - **Push mode** (`type="signature"`): The client has already broadcast
|
|
18
|
+
* and confirmed the transaction. The server verifies the transfer
|
|
19
|
+
* on-chain using the signature.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { Mppx, solana } from 'solana-mpp-sdk/server'
|
|
24
|
+
*
|
|
25
|
+
* const mppx = Mppx.create({
|
|
26
|
+
* methods: [solana.charge({
|
|
27
|
+
* recipient: 'RecipientPubkey...',
|
|
28
|
+
* splToken: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
|
|
29
|
+
* decimals: 6,
|
|
30
|
+
* network: 'devnet',
|
|
31
|
+
* })],
|
|
32
|
+
* })
|
|
33
|
+
*
|
|
34
|
+
* export async function handler(request: Request) {
|
|
35
|
+
* const result = await mppx.charge({ amount: '1000000', currency: 'USDC' })(request)
|
|
36
|
+
* if (result.status === 402) return result.challenge
|
|
37
|
+
* return result.withReceipt(Response.json({ data: '...' }))
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function charge(parameters) {
|
|
42
|
+
const { recipient, splToken, decimals, tokenProgram = TOKEN_PROGRAM, network = 'mainnet-beta', store = Store.memory(), signer, } = parameters;
|
|
43
|
+
const rpcUrl = parameters.rpcUrl ?? DEFAULT_RPC_URLS[network] ?? DEFAULT_RPC_URLS['mainnet-beta'];
|
|
44
|
+
if (splToken && decimals === undefined) {
|
|
45
|
+
throw new Error('decimals is required when splToken is set');
|
|
46
|
+
}
|
|
47
|
+
if (signer && !isTransactionPartialSigner(signer)) {
|
|
48
|
+
throw new Error('signer must implement signTransactions() for fee payer mode (e.g. KeyPairSigner, SolanaSigner)');
|
|
49
|
+
}
|
|
50
|
+
return Method.toServer(Methods.charge, {
|
|
51
|
+
defaults: {
|
|
52
|
+
currency: splToken ? 'token' : 'SOL',
|
|
53
|
+
methodDetails: {
|
|
54
|
+
reference: '',
|
|
55
|
+
},
|
|
56
|
+
recipient: '',
|
|
57
|
+
},
|
|
58
|
+
async request({ credential, request }) {
|
|
59
|
+
if (credential) {
|
|
60
|
+
return credential.challenge.request;
|
|
61
|
+
}
|
|
62
|
+
const reference = crypto.randomUUID();
|
|
63
|
+
// Pre-fetch a recent blockhash so the client can skip an RPC call.
|
|
64
|
+
let recentBlockhash;
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetch(rpcUrl, {
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
id: 1,
|
|
69
|
+
jsonrpc: '2.0',
|
|
70
|
+
method: 'getLatestBlockhash',
|
|
71
|
+
params: [{ commitment: 'confirmed' }],
|
|
72
|
+
}),
|
|
73
|
+
headers: { 'Content-Type': 'application/json' },
|
|
74
|
+
method: 'POST',
|
|
75
|
+
});
|
|
76
|
+
const data = (await res.json());
|
|
77
|
+
recentBlockhash = data.result?.value?.blockhash;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Non-fatal — client will fetch its own blockhash.
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
...request,
|
|
84
|
+
methodDetails: {
|
|
85
|
+
network,
|
|
86
|
+
reference,
|
|
87
|
+
...(splToken ? { decimals, splToken, tokenProgram } : {}),
|
|
88
|
+
...(signer ? { feePayer: true, feePayerKey: signer.address } : {}),
|
|
89
|
+
...(recentBlockhash ? { recentBlockhash } : {}),
|
|
90
|
+
},
|
|
91
|
+
recipient,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
async verify({ credential }) {
|
|
95
|
+
const cred = credential;
|
|
96
|
+
const challenge = cred.challenge.request;
|
|
97
|
+
const payloadType = resolvePayloadType(cred.payload);
|
|
98
|
+
// Spec: type="signature" MUST NOT be used with feePayer: true
|
|
99
|
+
if (payloadType === 'signature' && challenge.methodDetails.feePayer) {
|
|
100
|
+
throw new Error('type="signature" credentials cannot be used with fee sponsorship (feePayer: true)');
|
|
101
|
+
}
|
|
102
|
+
if (payloadType === 'transaction') {
|
|
103
|
+
return await verifyTransaction(cred, challenge, rpcUrl, recipient, store, signer);
|
|
104
|
+
}
|
|
105
|
+
return await verifySignature(cred, challenge, rpcUrl, recipient, store);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// ── Payload type resolution ──
|
|
110
|
+
function resolvePayloadType(payload) {
|
|
111
|
+
if (payload.type === 'signature')
|
|
112
|
+
return 'signature';
|
|
113
|
+
if (payload.type === 'transaction')
|
|
114
|
+
return 'transaction';
|
|
115
|
+
throw new Error('Missing or invalid payload type: must be "transaction" or "signature"');
|
|
116
|
+
}
|
|
117
|
+
// ── Pull mode (type="transaction") ──
|
|
118
|
+
async function verifyTransaction(credential, challenge, rpcUrl, recipient, store, signer) {
|
|
119
|
+
const { transaction: clientTxBase64 } = credential.payload;
|
|
120
|
+
if (!clientTxBase64) {
|
|
121
|
+
throw new Error('Missing transaction data in credential payload');
|
|
122
|
+
}
|
|
123
|
+
let txToSend = clientTxBase64;
|
|
124
|
+
// When the server has a fee payer signer, decode the client's partially-signed
|
|
125
|
+
// transaction, add the fee payer signature, and re-encode.
|
|
126
|
+
// NOTE: The fee payer covers all tx costs including ATA rent (~0.002 SOL).
|
|
127
|
+
// Recipients can close ATAs to reclaim rent, forcing re-creation on the next
|
|
128
|
+
// payment. Servers should verify ATA existence before signing or factor rent
|
|
129
|
+
// into pricing to mitigate this drain vector.
|
|
130
|
+
if (signer) {
|
|
131
|
+
txToSend = await coSignBase64Transaction(signer, clientTxBase64);
|
|
132
|
+
}
|
|
133
|
+
// Simulate before broadcast to catch failures without wasting fees.
|
|
134
|
+
await simulateTransaction(rpcUrl, txToSend);
|
|
135
|
+
// Broadcast the (now fully-signed) transaction.
|
|
136
|
+
const signature = await broadcastTransaction(rpcUrl, txToSend);
|
|
137
|
+
// Wait for on-chain confirmation.
|
|
138
|
+
await waitForConfirmation(rpcUrl, signature);
|
|
139
|
+
// Verify the confirmed transaction matches the challenge.
|
|
140
|
+
await verifyOnChain(rpcUrl, signature, challenge, recipient);
|
|
141
|
+
// Mark consumed to prevent replay.
|
|
142
|
+
await store.put(`solana-charge:consumed:${signature}`, true);
|
|
143
|
+
return Receipt.from({
|
|
144
|
+
method: 'solana',
|
|
145
|
+
reference: signature,
|
|
146
|
+
status: 'success',
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// ── Push mode (type="signature") ──
|
|
151
|
+
async function verifySignature(credential, challenge, rpcUrl, recipient, store) {
|
|
152
|
+
const { signature } = credential.payload;
|
|
153
|
+
if (!signature) {
|
|
154
|
+
throw new Error('Missing signature in credential payload');
|
|
155
|
+
}
|
|
156
|
+
// Replay prevention: reject already-consumed transaction signatures.
|
|
157
|
+
const consumedKey = `solana-charge:consumed:${signature}`;
|
|
158
|
+
if (await store.get(consumedKey)) {
|
|
159
|
+
throw new Error('Transaction signature already consumed');
|
|
160
|
+
}
|
|
161
|
+
// Fetch and verify the transaction on-chain.
|
|
162
|
+
const tx = await fetchTransaction(rpcUrl, signature);
|
|
163
|
+
if (!tx)
|
|
164
|
+
throw new Error('Transaction not found or not yet confirmed');
|
|
165
|
+
if (tx.meta?.err)
|
|
166
|
+
throw new Error('Transaction failed on-chain');
|
|
167
|
+
const instructions = tx.transaction.message.instructions;
|
|
168
|
+
await verifyInstructions(instructions, challenge, recipient);
|
|
169
|
+
// Mark consumed to prevent replay.
|
|
170
|
+
await store.put(consumedKey, true);
|
|
171
|
+
return Receipt.from({
|
|
172
|
+
method: 'solana',
|
|
173
|
+
reference: signature,
|
|
174
|
+
status: 'success',
|
|
175
|
+
timestamp: new Date().toISOString(),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// ── Shared on-chain verification ──
|
|
179
|
+
async function verifyOnChain(rpcUrl, signature, challenge, recipient) {
|
|
180
|
+
const tx = await fetchTransaction(rpcUrl, signature);
|
|
181
|
+
if (!tx)
|
|
182
|
+
throw new Error('Transaction not found or not yet confirmed');
|
|
183
|
+
if (tx.meta?.err)
|
|
184
|
+
throw new Error('Transaction failed on-chain');
|
|
185
|
+
const instructions = tx.transaction.message.instructions;
|
|
186
|
+
await verifyInstructions(instructions, challenge, recipient);
|
|
187
|
+
}
|
|
188
|
+
async function verifyInstructions(instructions, challenge, recipient) {
|
|
189
|
+
const expectedAmount = challenge.amount;
|
|
190
|
+
if (challenge.methodDetails.splToken) {
|
|
191
|
+
// ── SPL token transfer verification ──
|
|
192
|
+
const transfer = instructions.find(ix => ix.parsed?.type === 'transferChecked' &&
|
|
193
|
+
(ix.programId === TOKEN_PROGRAM || ix.programId === TOKEN_2022_PROGRAM));
|
|
194
|
+
if (!transfer) {
|
|
195
|
+
throw new Error('No TransferChecked instruction found in transaction');
|
|
196
|
+
}
|
|
197
|
+
const info = transfer.parsed.info;
|
|
198
|
+
if (info.mint !== challenge.methodDetails.splToken) {
|
|
199
|
+
throw new Error(`Token mint mismatch: expected ${challenge.methodDetails.splToken}, got ${info.mint}`);
|
|
200
|
+
}
|
|
201
|
+
if (info.tokenAmount.amount !== expectedAmount) {
|
|
202
|
+
throw new Error(`Amount mismatch: expected ${expectedAmount}, got ${info.tokenAmount.amount}`);
|
|
203
|
+
}
|
|
204
|
+
// Verify destination ATA belongs to the expected recipient.
|
|
205
|
+
const expectedTokenProgram = challenge.methodDetails.tokenProgram || TOKEN_PROGRAM;
|
|
206
|
+
const [expectedAta] = await findAssociatedTokenPda({
|
|
207
|
+
mint: address(challenge.methodDetails.splToken),
|
|
208
|
+
owner: address(recipient),
|
|
209
|
+
tokenProgram: address(expectedTokenProgram),
|
|
210
|
+
});
|
|
211
|
+
if (info.destination !== expectedAta) {
|
|
212
|
+
throw new Error('Destination token account does not belong to expected recipient');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
// ── Native SOL transfer verification ──
|
|
217
|
+
const transfer = instructions.find(ix => ix.parsed?.type === 'transfer' && ix.program === 'system');
|
|
218
|
+
if (!transfer) {
|
|
219
|
+
throw new Error('No system transfer instruction found in transaction');
|
|
220
|
+
}
|
|
221
|
+
const info = transfer.parsed.info;
|
|
222
|
+
if (info.destination !== recipient) {
|
|
223
|
+
throw new Error(`Recipient mismatch: expected ${recipient}, got ${info.destination}`);
|
|
224
|
+
}
|
|
225
|
+
if (String(info.lamports) !== expectedAmount) {
|
|
226
|
+
throw new Error(`Amount mismatch: expected ${expectedAmount} lamports, got ${info.lamports}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ── RPC helpers ──
|
|
231
|
+
async function fetchTransaction(rpcUrl, signature) {
|
|
232
|
+
const response = await fetch(rpcUrl, {
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
id: 1,
|
|
235
|
+
jsonrpc: '2.0',
|
|
236
|
+
method: 'getTransaction',
|
|
237
|
+
params: [
|
|
238
|
+
signature,
|
|
239
|
+
{
|
|
240
|
+
commitment: 'confirmed',
|
|
241
|
+
encoding: 'jsonParsed',
|
|
242
|
+
maxSupportedTransactionVersion: 0,
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
}),
|
|
246
|
+
headers: { 'Content-Type': 'application/json' },
|
|
247
|
+
method: 'POST',
|
|
248
|
+
});
|
|
249
|
+
const data = (await response.json());
|
|
250
|
+
if (data.error)
|
|
251
|
+
throw new Error(`RPC error: ${data.error.message}`);
|
|
252
|
+
return data.result ?? null;
|
|
253
|
+
}
|
|
254
|
+
async function simulateTransaction(rpcUrl, base64Tx) {
|
|
255
|
+
const response = await fetch(rpcUrl, {
|
|
256
|
+
body: JSON.stringify({
|
|
257
|
+
id: 1,
|
|
258
|
+
jsonrpc: '2.0',
|
|
259
|
+
method: 'simulateTransaction',
|
|
260
|
+
params: [base64Tx, { commitment: 'confirmed', encoding: 'base64' }],
|
|
261
|
+
}),
|
|
262
|
+
headers: { 'Content-Type': 'application/json' },
|
|
263
|
+
method: 'POST',
|
|
264
|
+
});
|
|
265
|
+
const data = (await response.json());
|
|
266
|
+
if (data.error)
|
|
267
|
+
throw new Error(`RPC error: ${data.error.message}`);
|
|
268
|
+
const simErr = data.result?.value?.err;
|
|
269
|
+
if (simErr) {
|
|
270
|
+
throw new Error(`Transaction simulation failed: ${JSON.stringify(simErr)}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async function broadcastTransaction(rpcUrl, base64Tx) {
|
|
274
|
+
const response = await fetch(rpcUrl, {
|
|
275
|
+
body: JSON.stringify({
|
|
276
|
+
id: 1,
|
|
277
|
+
jsonrpc: '2.0',
|
|
278
|
+
method: 'sendTransaction',
|
|
279
|
+
params: [base64Tx, { encoding: 'base64', skipPreflight: false }],
|
|
280
|
+
}),
|
|
281
|
+
headers: { 'Content-Type': 'application/json' },
|
|
282
|
+
method: 'POST',
|
|
283
|
+
});
|
|
284
|
+
const data = (await response.json());
|
|
285
|
+
if (data.error)
|
|
286
|
+
throw new Error(`RPC error: ${data.error.message}`);
|
|
287
|
+
if (!data.result)
|
|
288
|
+
throw new Error('No signature returned from sendTransaction');
|
|
289
|
+
return data.result;
|
|
290
|
+
}
|
|
291
|
+
async function waitForConfirmation(rpcUrl, signature, timeoutMs = 30_000) {
|
|
292
|
+
const start = Date.now();
|
|
293
|
+
while (Date.now() - start < timeoutMs) {
|
|
294
|
+
const response = await fetch(rpcUrl, {
|
|
295
|
+
body: JSON.stringify({
|
|
296
|
+
id: 1,
|
|
297
|
+
jsonrpc: '2.0',
|
|
298
|
+
method: 'getSignatureStatuses',
|
|
299
|
+
params: [[signature]],
|
|
300
|
+
}),
|
|
301
|
+
headers: { 'Content-Type': 'application/json' },
|
|
302
|
+
method: 'POST',
|
|
303
|
+
});
|
|
304
|
+
const data = (await response.json());
|
|
305
|
+
const status = data.result?.value?.[0];
|
|
306
|
+
if (status) {
|
|
307
|
+
if (status.err) {
|
|
308
|
+
throw new Error(`Transaction failed: ${JSON.stringify(status.err)}`);
|
|
309
|
+
}
|
|
310
|
+
if (status.confirmationStatus === 'confirmed' || status.confirmationStatus === 'finalized') {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
await new Promise(r => setTimeout(r, 2_000));
|
|
315
|
+
}
|
|
316
|
+
throw new Error('Transaction confirmation timeout');
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=Charge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Charge.js","sourceRoot":"","sources":["../../sdk/src/server/Charge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { charge as charge_ } from './Charge.js';
|
|
2
|
+
import { session as session_ } from './Session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates Solana payment methods for usage on the server.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Mppx, solana } from 'solana-mpp-sdk/server'
|
|
9
|
+
*
|
|
10
|
+
* const mppx = Mppx.create({
|
|
11
|
+
* methods: [solana.charge({ recipient: '...', network: 'devnet' })],
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare const solana: {
|
|
16
|
+
(parameters: solana.Parameters): ReturnType<typeof charge_>;
|
|
17
|
+
charge: typeof charge_;
|
|
18
|
+
session: typeof session_;
|
|
19
|
+
};
|
|
20
|
+
export declare namespace solana {
|
|
21
|
+
type Parameters = charge_.Parameters;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../sdk/src/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,EAAE;IACjB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;IAC5D,MAAM,EAAE,OAAO,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,QAAQ,CAAC;CAI3B,CAAC;AAEH,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC5B,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CACxC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { charge as charge_ } from './Charge.js';
|
|
2
|
+
import { session as session_ } from './Session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates Solana payment methods for usage on the server.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Mppx, solana } from 'solana-mpp-sdk/server'
|
|
9
|
+
*
|
|
10
|
+
* const mppx = Mppx.create({
|
|
11
|
+
* methods: [solana.charge({ recipient: '...', network: 'devnet' })],
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const solana = Object.assign((parameters) => solana.charge(parameters), {
|
|
16
|
+
charge: charge_,
|
|
17
|
+
session: session_,
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=Methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../sdk/src/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAIf,MAAM,CAAC,MAAM,CAAC,CAAC,UAA6B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;IAC5E,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,QAAQ;CACpB,CAAC,CAAC"}
|