@keelcodes/sdk 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,5 +7,6 @@ export * from './userop';
7
7
  export * from './kernel-account';
8
8
  export * from './keel-session';
9
9
  export * from './x402';
10
+ export * from './x402-solana';
10
11
  export * from './x402-session';
11
12
  export * from './bundler';
package/dist/aa/index.js CHANGED
@@ -26,5 +26,6 @@ __exportStar(require("./userop"), exports);
26
26
  __exportStar(require("./kernel-account"), exports);
27
27
  __exportStar(require("./keel-session"), exports);
28
28
  __exportStar(require("./x402"), exports);
29
+ __exportStar(require("./x402-solana"), exports);
29
30
  __exportStar(require("./x402-session"), exports);
30
31
  __exportStar(require("./bundler"), exports);
@@ -0,0 +1,99 @@
1
+ import type { X402Accept, X402PaymentRequired, X402ResourceInfo } from './x402';
2
+ /** CAIP-2 Solana network 前缀(如 `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`)。 */
3
+ export declare const SOLANA_NETWORK_PREFIX = "solana:";
4
+ /** Solana x402 签名域分隔标签。 */
5
+ export declare const SOLANA_X402_DOMAIN = "x402-solana-v2";
6
+ /** Solana 原生资产标签(与账本 `asset` 列一致,金额单位为 lamports)。 */
7
+ export declare const SOLANA_X402_ASSET = "sol";
8
+ export interface X402SolanaPaymentPayload {
9
+ x402Version: 2;
10
+ resource?: X402ResourceInfo;
11
+ accepted: X402Accept;
12
+ payload: {
13
+ method: string;
14
+ url: string;
15
+ /** 重放保护随机串(字符串即可;缺省由 txHash + 时间派生) */
16
+ salt: string;
17
+ /** 链上付款交易签名(base58) */
18
+ txHash: string;
19
+ /** 付款人公钥(base58) */
20
+ payer: string;
21
+ };
22
+ extensions?: Record<string, unknown>;
23
+ /** base58(ed25519 signature, 64B) */
24
+ signature: string;
25
+ }
26
+ /** 链上付款参数:向 `to` 转 `lamports`,原生 SOL。 */
27
+ export interface X402SolanaPayment {
28
+ to: string;
29
+ lamports: bigint;
30
+ asset: typeof SOLANA_X402_ASSET;
31
+ }
32
+ /**
33
+ * Solana 会话签名器:只需公钥 + 对原始消息签名。
34
+ * 私钥始终留在客户端(session key / 智能账户),SDK 不接触。
35
+ */
36
+ export interface X402SolanaSigner {
37
+ /** base58 公钥(= payload.payer) */
38
+ publicKey: string;
39
+ /** 返回 64B 签名:Uint8Array 或 base58 字符串 */
40
+ signMessage(message: Uint8Array): Promise<Uint8Array | string>;
41
+ }
42
+ export interface PayX402WithSolanaParams {
43
+ challenge: X402PaymentRequired;
44
+ /** 不传则自动选第一个 Solana accept */
45
+ accept?: X402Accept;
46
+ /** 发起链上转账并返回交易签名(base58) */
47
+ sendPayment: (payment: X402SolanaPayment) => Promise<{
48
+ signature: string;
49
+ payer?: string;
50
+ }>;
51
+ signer: X402SolanaSigner;
52
+ /** 等交易确认(建议传入,避免服务端校验时还查不到) */
53
+ waitForConfirmation?: (signature: string) => Promise<unknown>;
54
+ method?: string;
55
+ url?: string;
56
+ salt?: string;
57
+ }
58
+ export interface PayX402WithSolanaResult {
59
+ /** 可直接写入 `PAYMENT-SIGNATURE` 头 */
60
+ header: string;
61
+ payload: X402SolanaPaymentPayload;
62
+ /** 链上付款交易签名(= payload.payload.txHash) */
63
+ txHash: string;
64
+ payment: X402SolanaPayment;
65
+ accept: X402Accept;
66
+ }
67
+ /** base58 编码(仅用于把 64B ed25519 签名转成 wire 形态)。 */
68
+ export declare function encodeBase58(bytes: Uint8Array): string;
69
+ export declare function isSolanaAccept(accept: X402Accept): boolean;
70
+ /** 选 Solana accept:优先 exact;可按 network 精确过滤。 */
71
+ export declare function selectSolanaAccept(challenge: X402PaymentRequired, opts?: {
72
+ network?: string;
73
+ }): X402Accept;
74
+ /** 按 accept 组装转账参数(原生 SOL)。 */
75
+ export declare function buildSolanaX402Payment(accept: X402Accept): X402SolanaPayment;
76
+ /** 构造待签消息(必须与 payments `buildSolanaPaymentMessage` 逐字节一致)。 */
77
+ export declare function buildSolanaX402Message(payload: X402SolanaPaymentPayload): Uint8Array;
78
+ /** 由链上付款结果构造未签名的 payload。 */
79
+ export declare function buildSolanaX402Payload(args: {
80
+ challenge: X402PaymentRequired;
81
+ accepted: X402Accept;
82
+ txHash: string;
83
+ payer: string;
84
+ method?: string;
85
+ url?: string;
86
+ salt?: string;
87
+ }): X402SolanaPaymentPayload;
88
+ /**
89
+ * 用 Solana 会话密钥签 x402 payload,返回 base58 签名。
90
+ * 写入 `payload.signature` 后即可 base64 成 `PAYMENT-SIGNATURE`。
91
+ */
92
+ export declare function signX402WithSolanaSession(payload: X402SolanaPaymentPayload, signer: X402SolanaSigner): Promise<string>;
93
+ /** 把已签名的 payload 编码成 `PAYMENT-SIGNATURE` 头。 */
94
+ export declare function encodeSolanaPaymentSignature(payload: X402SolanaPaymentPayload): string;
95
+ /**
96
+ * 一次完成「链上转账 → 等确认 → x402 凭证签名」。
97
+ * 转账由调用方注入(可用 aa-relay `/solana/submit` 广播,gas 可垫付)。
98
+ */
99
+ export declare function payX402WithSolana(params: PayX402WithSolanaParams): Promise<PayX402WithSolanaResult>;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // x402 v2 · Solana(verifyOnly)客户端
4
+ //
5
+ // 结算模型与 EVM 一致:客户端自己广播 SOL 转账,服务端只做「验签 + 链上校验 +
6
+ // 入账」,没有 facilitator `/settle`。
7
+ //
8
+ // 与 payments 服务端(`protocol/x402-v2.ts`)逐字节对齐:
9
+ // message = ["x402-solana-v2", scheme, network, amount, asset, payTo,
10
+ // method, url, salt, txHash].join("\n")
11
+ // header = base64(JSON({ x402Version, resource, accepted,
12
+ // payload:{method,url,salt,txHash,payer}, signature }))
13
+ //
14
+ // EVM 用 EIP-712 把「accepted + payload」绑定到付款人;SVM 没有等价的结构化
15
+ // 签名,改用 ed25519 对上面这条确定性消息签名,payer 由 `payload.payer` 显式给出
16
+ // (ed25519 无法从签名恢复公钥),服务端再用该公钥验签 + 校验链上同址。
17
+ // ---------------------------------------------------------------------------
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.SOLANA_X402_ASSET = exports.SOLANA_X402_DOMAIN = exports.SOLANA_NETWORK_PREFIX = void 0;
20
+ exports.encodeBase58 = encodeBase58;
21
+ exports.isSolanaAccept = isSolanaAccept;
22
+ exports.selectSolanaAccept = selectSolanaAccept;
23
+ exports.buildSolanaX402Payment = buildSolanaX402Payment;
24
+ exports.buildSolanaX402Message = buildSolanaX402Message;
25
+ exports.buildSolanaX402Payload = buildSolanaX402Payload;
26
+ exports.signX402WithSolanaSession = signX402WithSolanaSession;
27
+ exports.encodeSolanaPaymentSignature = encodeSolanaPaymentSignature;
28
+ exports.payX402WithSolana = payX402WithSolana;
29
+ const x402_1 = require("./x402");
30
+ /** CAIP-2 Solana network 前缀(如 `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`)。 */
31
+ exports.SOLANA_NETWORK_PREFIX = 'solana:';
32
+ /** Solana x402 签名域分隔标签。 */
33
+ exports.SOLANA_X402_DOMAIN = 'x402-solana-v2';
34
+ /** Solana 原生资产标签(与账本 `asset` 列一致,金额单位为 lamports)。 */
35
+ exports.SOLANA_X402_ASSET = 'sol';
36
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
37
+ /** base58 编码(仅用于把 64B ed25519 签名转成 wire 形态)。 */
38
+ function encodeBase58(bytes) {
39
+ let zeros = 0;
40
+ while (zeros < bytes.length && bytes[zeros] === 0)
41
+ zeros++;
42
+ const digits = [];
43
+ for (let i = zeros; i < bytes.length; i++) {
44
+ let carry = bytes[i];
45
+ for (let j = 0; j < digits.length; j++) {
46
+ carry += digits[j] << 8;
47
+ digits[j] = carry % 58;
48
+ carry = (carry / 58) | 0;
49
+ }
50
+ while (carry > 0) {
51
+ digits.push(carry % 58);
52
+ carry = (carry / 58) | 0;
53
+ }
54
+ }
55
+ let out = '1'.repeat(zeros);
56
+ for (let i = digits.length - 1; i >= 0; i--)
57
+ out += BASE58_ALPHABET[digits[i]];
58
+ return out;
59
+ }
60
+ function isSolanaAccept(accept) {
61
+ return (String(accept.network ?? '').startsWith(exports.SOLANA_NETWORK_PREFIX) &&
62
+ String(accept.asset ?? '').toLowerCase() === exports.SOLANA_X402_ASSET);
63
+ }
64
+ /** 选 Solana accept:优先 exact;可按 network 精确过滤。 */
65
+ function selectSolanaAccept(challenge, opts = {}) {
66
+ const matches = challenge.accepts.filter((a) => isSolanaAccept(a) && (opts.network === undefined || a.network === opts.network));
67
+ const pick = matches.find((a) => a.scheme === 'exact') ?? matches[0];
68
+ if (!pick)
69
+ throw new Error('[keel-sdk] no Solana accept in this x402 challenge');
70
+ return pick;
71
+ }
72
+ /** 按 accept 组装转账参数(原生 SOL)。 */
73
+ function buildSolanaX402Payment(accept) {
74
+ if (!isSolanaAccept(accept)) {
75
+ throw new Error(`[keel-sdk] accept is not Solana native: ${accept.network}/${accept.asset}`);
76
+ }
77
+ const lamports = BigInt(accept.amount);
78
+ if (lamports <= 0n)
79
+ throw new Error('[keel-sdk] x402 amount must be > 0');
80
+ if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(accept.payTo)) {
81
+ throw new Error(`[keel-sdk] invalid Solana payTo: ${accept.payTo}`);
82
+ }
83
+ return { to: accept.payTo, lamports, asset: exports.SOLANA_X402_ASSET };
84
+ }
85
+ /** 构造待签消息(必须与 payments `buildSolanaPaymentMessage` 逐字节一致)。 */
86
+ function buildSolanaX402Message(payload) {
87
+ const { accepted } = payload;
88
+ return new TextEncoder().encode([
89
+ exports.SOLANA_X402_DOMAIN,
90
+ accepted.scheme,
91
+ accepted.network,
92
+ accepted.amount,
93
+ accepted.asset,
94
+ accepted.payTo,
95
+ payload.payload.method,
96
+ payload.payload.url,
97
+ payload.payload.salt,
98
+ payload.payload.txHash,
99
+ ].join('\n'));
100
+ }
101
+ /** 由链上付款结果构造未签名的 payload。 */
102
+ function buildSolanaX402Payload(args) {
103
+ return {
104
+ x402Version: 2,
105
+ resource: args.challenge.resource,
106
+ accepted: args.accepted,
107
+ payload: {
108
+ method: args.method ?? 'GET',
109
+ url: args.url ?? args.challenge.resource?.url ?? '',
110
+ salt: args.salt ?? `${args.txHash}:${Date.now()}:${Math.random().toString(36).slice(2)}`,
111
+ txHash: args.txHash,
112
+ payer: args.payer,
113
+ },
114
+ signature: '',
115
+ };
116
+ }
117
+ /**
118
+ * 用 Solana 会话密钥签 x402 payload,返回 base58 签名。
119
+ * 写入 `payload.signature` 后即可 base64 成 `PAYMENT-SIGNATURE`。
120
+ */
121
+ async function signX402WithSolanaSession(payload, signer) {
122
+ if (payload.payload.payer !== signer.publicKey) {
123
+ throw new Error('[keel-sdk] payload.payer does not match the signing publicKey');
124
+ }
125
+ const raw = await signer.signMessage(buildSolanaX402Message(payload));
126
+ const sig = typeof raw === 'string' ? raw : encodeBase58(raw);
127
+ if (!/^[1-9A-HJ-NP-Za-km-z]{64,88}$/.test(sig)) {
128
+ throw new Error('[keel-sdk] signMessage must return a 64-byte ed25519 signature');
129
+ }
130
+ return sig;
131
+ }
132
+ /** 把已签名的 payload 编码成 `PAYMENT-SIGNATURE` 头。 */
133
+ function encodeSolanaPaymentSignature(payload) {
134
+ return (0, x402_1.toBase64)(JSON.stringify(payload));
135
+ }
136
+ /**
137
+ * 一次完成「链上转账 → 等确认 → x402 凭证签名」。
138
+ * 转账由调用方注入(可用 aa-relay `/solana/submit` 广播,gas 可垫付)。
139
+ */
140
+ async function payX402WithSolana(params) {
141
+ const accept = params.accept ?? selectSolanaAccept(params.challenge);
142
+ const payment = buildSolanaX402Payment(accept);
143
+ const sent = await params.sendPayment(payment);
144
+ const txHash = String(sent?.signature ?? '').trim();
145
+ if (!/^[1-9A-HJ-NP-Za-km-z]{64,88}$/.test(txHash)) {
146
+ throw new Error(`[keel-sdk] sendPayment must return a base58 tx signature, got ${txHash}`);
147
+ }
148
+ const payer = String(sent.payer ?? params.signer.publicKey);
149
+ if (payer !== params.signer.publicKey) {
150
+ throw new Error('[keel-sdk] sendPayment payer differs from the x402 signing key');
151
+ }
152
+ if (params.waitForConfirmation)
153
+ await params.waitForConfirmation(txHash);
154
+ const unsigned = buildSolanaX402Payload({
155
+ challenge: params.challenge,
156
+ accepted: accept,
157
+ txHash,
158
+ payer,
159
+ method: params.method,
160
+ url: params.url,
161
+ salt: params.salt,
162
+ });
163
+ unsigned.signature = await signX402WithSolanaSession(unsigned, params.signer);
164
+ return {
165
+ header: encodeSolanaPaymentSignature(unsigned),
166
+ payload: unsigned,
167
+ txHash,
168
+ payment,
169
+ accept,
170
+ };
171
+ }
package/dist/http.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { KeelConfig } from './types';
2
2
  /** SDK 版本(契约 §5,随包版本同步)。 */
3
- export declare const SDK_VERSION = "2.3.2";
3
+ export declare const SDK_VERSION = "2.4.0";
4
4
  export declare class HttpClient {
5
5
  private baseUrl;
6
6
  private headers;
package/dist/http.js CHANGED
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.HttpClient = exports.SDK_VERSION = void 0;
7
7
  const errors_1 = require("./errors");
8
8
  /** SDK 版本(契约 §5,随包版本同步)。 */
9
- exports.SDK_VERSION = '2.3.2';
9
+ exports.SDK_VERSION = '2.4.0';
10
10
  /**
11
11
  * 钱包签名的复用时长(ms):首次签名后在该窗口内复用,避免每个请求都触发钱包弹窗。
12
12
  * 服务端会话 TTL 为 24h,此处取 1h 留足余量。
@@ -88,7 +88,7 @@ class HttpClient {
88
88
  return { ...this.headers, ...this.walletToken.headers };
89
89
  }
90
90
  const timestamp = String(now);
91
- const signature = await this.wallet.sign(`InfraX auth: ${timestamp}`);
91
+ const signature = await this.wallet.sign(`Keel auth: ${timestamp}`);
92
92
  const headers = {
93
93
  'x-wallet-address': this.wallet.address.toLowerCase(),
94
94
  'x-wallet-timestamp': timestamp,
@@ -1,6 +1,7 @@
1
1
  export * from './types';
2
2
  export * from './solana-account-types';
3
3
  export * from './solana-execution-types';
4
+ export * from './solana-dex-types';
4
5
  export * from './mpc-types';
5
6
  export * from './wallet-api';
6
7
  export * from '../aa';
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  __exportStar(require("./types"), exports);
21
21
  __exportStar(require("./solana-account-types"), exports);
22
22
  __exportStar(require("./solana-execution-types"), exports);
23
+ __exportStar(require("./solana-dex-types"), exports);
23
24
  __exportStar(require("./mpc-types"), exports);
24
25
  __exportStar(require("./wallet-api"), exports);
25
26
  __exportStar(require("../aa"), exports);
@@ -0,0 +1,136 @@
1
+ import type { SolanaSubmitResult } from './solana-execution-types';
2
+ /** DEX 报价(只读,不构建交易) */
3
+ export interface SolanaDexQuoteParams {
4
+ chain: string;
5
+ inputMint: string;
6
+ outputMint: string;
7
+ /** base units(十进制整数) */
8
+ amount: string | number;
9
+ slippageBps?: number;
10
+ }
11
+ export interface SolanaDexQuoteResult {
12
+ chain: string;
13
+ /** Jupiter 原始报价(字段随聚合器版本变化,按需读取) */
14
+ quote: Record<string, unknown>;
15
+ inputMint: string;
16
+ inAmount: string;
17
+ outputMint: string;
18
+ outAmount: string;
19
+ otherAmountThreshold: string;
20
+ priceImpactPct: string;
21
+ slippageBps: number;
22
+ }
23
+ /** `ProgramInteraction` policy 安装入参(`/dex/policy` 与 `/dex/install` 通用) */
24
+ export interface SolanaDexPolicyParams {
25
+ chain: string;
26
+ blockhash: string;
27
+ feePayer: string;
28
+ creator: string;
29
+ settingsPda: string;
30
+ transactionIndex: string | number;
31
+ /** policy PDA 的 u64 seed(= 调用前链上 `settings.policySeed + 1`) */
32
+ seed: string | number;
33
+ /** 作为 policy 唯一签名者的 session key 公钥 */
34
+ sessionKey: string;
35
+ rentPayer?: string;
36
+ accountIndex?: number;
37
+ /** 缺省 `[1,2,4]`(Initiate | Vote | Execute) */
38
+ permissions?: number[];
39
+ spendingLimits?: Array<{
40
+ mint: string;
41
+ /** base units(十进制整数) */
42
+ maxPerPeriod: string | number;
43
+ period?: number;
44
+ start?: string | number;
45
+ expiration?: string | number;
46
+ }>;
47
+ /** 缺省 = relay 配置里的 program 白名单(Jupiter + 直连 DEX + 辅助 program) */
48
+ constraints?: Array<{
49
+ programId: string;
50
+ accountConstraints?: Array<{
51
+ accountIndex: number;
52
+ pubkeys: string[];
53
+ owner?: string;
54
+ }>;
55
+ dataConstraints?: Array<{
56
+ offset: string | number;
57
+ value?: string;
58
+ operator?: number;
59
+ }>;
60
+ }>;
61
+ memo?: string;
62
+ }
63
+ /** 安装计划中的一步(未签名交易,按 `steps` 顺序签名广播) */
64
+ export interface SolanaDexInstallStep {
65
+ step: 'createSettingsTransaction' | 'createProposal' | 'approveProposal' | 'executeSettingsTransaction';
66
+ /** 需要本地签名的公钥(base58) */
67
+ signers: string[];
68
+ instructionCount: number;
69
+ /** base64(v0) */
70
+ transaction: string;
71
+ }
72
+ export interface SolanaDexInstallResult {
73
+ chain: string;
74
+ policyPda: string;
75
+ /** 四步共用同一个 blockhash;过期未走完需重新调用 */
76
+ blockhash: string;
77
+ steps: SolanaDexInstallStep[];
78
+ }
79
+ export interface SolanaDexSwapParams {
80
+ chain: string;
81
+ blockhash: string;
82
+ feePayer: string;
83
+ /** policy PDA */
84
+ policy: string;
85
+ /** smart account(vault)PDA */
86
+ vaultPda: string;
87
+ sessionKey: string;
88
+ inputMint: string;
89
+ outputMint: string;
90
+ amount: string | number;
91
+ accountIndex?: number;
92
+ numSigners?: number;
93
+ slippageBps?: number;
94
+ wrapAndUnwrapSol?: boolean;
95
+ dynamicComputeUnitLimit?: boolean;
96
+ /**
97
+ * policy 创建时 `instructionsConstraints` 的顺序(programId 数组)。
98
+ * 缺省取 relay 配置白名单顺序;链上要求逐条指令都能映射到一条约束。
99
+ */
100
+ policyPrograms?: string[];
101
+ }
102
+ export interface SolanaDexSwapResult {
103
+ chain: string;
104
+ inAmount: string;
105
+ outAmount: string;
106
+ otherAmountThreshold: string;
107
+ priceImpactPct: string;
108
+ slippageBps: number;
109
+ innerInstructionCount: number;
110
+ instructionConstraintIndices: number[];
111
+ addressLookupTables: number;
112
+ transactionBytes: number;
113
+ /** 未签名交易(base64 v0);签名后经 `submit` 广播才会计费 */
114
+ transaction: string;
115
+ instructionCount?: number;
116
+ /** 计费提示:签名后发到该端点,relay 按 fee payer 收固定服务费 */
117
+ billing?: {
118
+ endpoint: string;
119
+ feePayer: string;
120
+ feeLamports: string;
121
+ };
122
+ }
123
+ /**
124
+ * 本地签名回调:入参为未签名交易(base64 v0)与需要签名的公钥,
125
+ * 返回已签名的 base64 交易。SDK 不内置 Solana 依赖,由调用方用
126
+ * `@solana/web3.js`(`VersionedTransaction.deserialize` → `sign`)实现。
127
+ */
128
+ export type SolanaTransactionSigner = (transaction: string, signers: string[]) => Promise<string> | string;
129
+ /** `dexSwapAndSubmit`:一次完成「取未签名交易 → 本地签名 → 经 relay 计费广播」。 */
130
+ export interface SolanaDexSwapAndSubmitParams extends SolanaDexSwapParams {
131
+ sign: SolanaTransactionSigner;
132
+ }
133
+ export interface SolanaDexSwapAndSubmitResult extends SolanaDexSwapResult {
134
+ /** relay `/submit` 的广播回执(计费发生在这里) */
135
+ submit: SolanaSubmitResult;
136
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -3,6 +3,7 @@ import type { KeelEnvelope } from '../types';
3
3
  import type { CreateWalletParams, WalletCreated, ImportWalletParams, SignParams, SignResult, SendParams, SendResult, ChainParams, ChainResult, WalletBalanceParams, WalletBalanceResult, SessionCreateParams, SessionCreated, PaymasterInfo, PaymasterVoucherParams, PaymasterVoucher } from './types';
4
4
  import type { SolanaDeriveAccountParams, SolanaDerivedAccount, SolanaCreateAccountParams, SolanaInstallPolicyParams, SolanaCreatePolicyTransactionParams, SolanaCreateProposalParams, SolanaApproveProposalParams, SolanaExecutePolicyTransactionParams, SolanaRemovePolicyParams } from './solana-account-types';
5
5
  import type { SolanaExecutePolicyPayloadParams, SolanaCloseSettingsParams, SolanaCloseTransactionParams, SolanaExecutePolicyParams, SolanaExecuteParams, SolanaRemoveSignerParams, SolanaSubmitParams, SolanaUnsignedTransaction, SolanaSubmitResult } from './solana-execution-types';
6
+ import type { SolanaDexQuoteParams, SolanaDexQuoteResult, SolanaDexPolicyParams, SolanaDexInstallResult, SolanaDexSwapParams, SolanaDexSwapResult, SolanaDexSwapAndSubmitParams, SolanaDexSwapAndSubmitResult } from './solana-dex-types';
6
7
  import type { MpcSendCodeParams, MpcVerifyParams, MpcBalanceParams, MpcSignMessageParams, MpcSignTypedDataParams, MpcSendTransactionParams, MpcContractCallParams, MpcContractWriteParams, MpcGasEstimateParams, MpcRegisterParams, MpcRegisterResult, MpcSolanaSignParams, MpcSolanaSignResult, MpcSolanaSendParams, MpcSolanaSendResult } from './mpc-types';
7
8
  export declare class WalletAPI {
8
9
  private http;
@@ -171,6 +172,18 @@ export declare class WalletAPI {
171
172
  execute: (p: SolanaExecuteParams) => Promise<SolanaUnsignedTransaction>;
172
173
  removeSigner: (p: SolanaRemoveSignerParams) => Promise<SolanaUnsignedTransaction>;
173
174
  submit: (p: SolanaSubmitParams) => Promise<SolanaSubmitResult>;
175
+ /** DEX:Jupiter 报价(只读,不构建交易)。 */
176
+ dexQuote: (p: SolanaDexQuoteParams) => Promise<SolanaDexQuoteResult>;
177
+ /** DEX:一站式 policy 安装——返回四笔未签名交易,按 `steps` 顺序本地签名广播。 */
178
+ dexInstallPolicy: (p: SolanaDexPolicyParams) => Promise<SolanaDexInstallResult>;
179
+ /** DEX:组装 ProgramInteraction swap 交易(未签名;签名后经 `submit` 广播并计费)。 */
180
+ dexSwap: (p: SolanaDexSwapParams) => Promise<SolanaDexSwapResult>;
181
+ /**
182
+ * DEX:一步完成 swap —— 取未签名交易 → `sign` 回调本地签名 → 经 `/submit` 广播。
183
+ * `sign` 由调用方提供(SDK 不内置 Solana 依赖),例如:
184
+ * `(b64) => { const tx = VersionedTransaction.deserialize(Buffer.from(b64, 'base64')); tx.sign([kp]); return Buffer.from(tx.serialize()).toString('base64') }`
185
+ */
186
+ dexSwapAndSubmit: (p: SolanaDexSwapAndSubmitParams) => Promise<SolanaDexSwapAndSubmitResult>;
174
187
  };
175
188
  };
176
189
  /** MPC(email 分片钱包)子域:canonical `/v1/wallet/mpc/*`。 */
@@ -153,6 +153,24 @@ class WalletAPI {
153
153
  execute: (p) => this.http.post('/v1/wallet/session/solana/session/execute', p),
154
154
  removeSigner: (p) => this.http.post('/v1/wallet/session/solana/session/remove-signer', p),
155
155
  submit: (p) => this.http.post('/v1/wallet/session/solana/submit', p),
156
+ /** DEX:Jupiter 报价(只读,不构建交易)。 */
157
+ dexQuote: (p) => this.http.post('/v1/wallet/session/solana/dex/quote', p),
158
+ /** DEX:一站式 policy 安装——返回四笔未签名交易,按 `steps` 顺序本地签名广播。 */
159
+ dexInstallPolicy: (p) => this.http.post('/v1/wallet/session/solana/dex/install', p),
160
+ /** DEX:组装 ProgramInteraction swap 交易(未签名;签名后经 `submit` 广播并计费)。 */
161
+ dexSwap: (p) => this.http.post('/v1/wallet/session/solana/dex/swap', p),
162
+ /**
163
+ * DEX:一步完成 swap —— 取未签名交易 → `sign` 回调本地签名 → 经 `/submit` 广播。
164
+ * `sign` 由调用方提供(SDK 不内置 Solana 依赖),例如:
165
+ * `(b64) => { const tx = VersionedTransaction.deserialize(Buffer.from(b64, 'base64')); tx.sign([kp]); return Buffer.from(tx.serialize()).toString('base64') }`
166
+ */
167
+ dexSwapAndSubmit: async (p) => {
168
+ const { sign, ...swap } = p;
169
+ const built = await this.http.post('/v1/wallet/session/solana/dex/swap', swap);
170
+ const signed = await sign(built.transaction, [...new Set([swap.feePayer, swap.sessionKey])]);
171
+ const submit = await this.http.post('/v1/wallet/session/solana/submit', { chain: swap.chain, transaction: signed });
172
+ return { ...built, submit };
173
+ },
156
174
  },
157
175
  };
158
176
  /** MPC(email 分片钱包)子域:canonical `/v1/wallet/mpc/*`。 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keelcodes/sdk",
3
- "version": "2.3.2",
3
+ "version": "2.4.0",
4
4
  "description": "Keel SDK — unified access to payment / wallet / data / account modules over https://keel.codes",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",