@dexterai/x402 5.0.1 → 5.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var W=Object.create;var P=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var n in t)P(e,n,{get:t[n],enumerable:!0})},I=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of L(t))!z.call(e,r)&&r!==n&&P(e,r,{get:()=>t[r],enumerable:!(i=H(t,r))||i.enumerable});return e};var C=(e,t,n)=>(n=e!=null?W(F(e)):{},I(t||!e||!e.__esModule?P(n,"default",{value:e,enumerable:!0}):n,e)),j=e=>I(P({},"__esModule",{value:!0}),e);var ie={};G(ie,{buildAdapterRegisterInstruction:()=>J,createSolanaVaultAdapter:()=>Z,deriveChannelId:()=>M,passkeySignerFromP256Keypair:()=>_});module.exports=j(ie);var o=require("@solana/web3.js");var y=require("@dexterai/vault/instructions"),b=require("@dexterai/vault/precompile"),m=require("@dexterai/vault/constants");var s=require("@dexterai/vault/messages");var x=C(require("tweetnacl"),1);var B=require("@noble/hashes/sha256");function R(){let e=x.default.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function D(e,t,n){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:n}}function V(e,t,n){if(n.length!==32)throw new Error(`channelIdBytes must be 32 bytes, got ${n.length}`);let i=BigInt(t.cumulativeAmount),r=BigInt(e.scope.maxAmountAtomic);if(i>r)throw new Error(`voucher cumulative ${i} exceeds session cap ${r}`);let a=Math.floor(Date.now()/1e3);if(a>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${a}`);let c=(0,s.voucherPayloadMessage)({channelId:n,cumulativeAmount:i,sequenceNumber:t.sequenceNumber}),l=x.default.sign.detached(c,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:l}}function K(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function M(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let n=new TextEncoder().encode(e.sellerUrl),i=B.sha256.create();return i.update(e.vaultPda.toBytes()),i.update(n),i.update(t),i.digest()}var u=require("@dexterai/vault/session"),U=require("@noble/hashes/sha256");var T=require("@noble/curves/p256"),g=require("@noble/hashes/sha256"),N="dexter.cash";function q(e){return Buffer.from(e).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function X(e,t=`https://${N}`){let i={type:"webauthn.get",challenge:q(e),origin:t,crossOrigin:!1};return new TextEncoder().encode(JSON.stringify(i))}function Y(e=1){let t=(0,g.sha256)(new TextEncoder().encode(N)),n=new Uint8Array(37);return n.set(t,0),n[32]=5,new DataView(n.buffer).setUint32(33,e,!1),n}function Q(e,t){let n=X(t),i=Y(1),r=new Uint8Array(i.length+32);r.set(i,0),r.set((0,g.sha256)(n),i.length);let a=(0,g.sha256)(r);return{signature:T.p256.sign(a,e.privateKey,{lowS:!0}).toCompactRawBytes(),clientDataJSON:n,authenticatorData:i}}function _(e){return{credentialId:new Uint8Array(0),publicKey:e.publicKey,signOperation:async t=>Q(e,(0,g.sha256)(t))}}function J(e){return(0,y.buildRegisterSessionKeyInstruction)({vaultPda:e.vaultPda,sessionPubkey:e.sessionPubkey,maxAmount:e.maxAmount,maxRevolvingCapacity:e.maxRevolvingCapacity,expiresAt:e.expiresAt,allowedCounterparty:e.allowedCounterparty,nonce:e.nonce,swigAddress:e.swigAddress,vaultUsdcAta:e.vaultUsdcAta,clientDataJSON:e.clientDataJSON,authenticatorData:e.authenticatorData,payer:e.payer,siblingSessionPdas:e.siblingSessionPdas})}var k=class{network="solana:mainnet";swigAddress;vaultPda;connection;vaultPdaKey;passkey;feePayer;confirmOptions;constructor(t){this.connection=t.connection,this.swigAddress=typeof t.swigAddress=="string"?t.swigAddress:t.swigAddress.toBase58(),this.vaultPdaKey=typeof t.vaultPda=="string"?new o.PublicKey(t.vaultPda):t.vaultPda,this.vaultPda=this.vaultPdaKey.toBase58(),this.passkey=t.passkeySigner,this.feePayer=t.feePayer,this.confirmOptions=t.confirmOptions??{commitment:"confirmed"}}async authorizeSession(t){let n=new o.PublicKey(t.allowedCounterparty),i=K(t.revolvingCapacityAtomic??t.maxAmountAtomic),r=R(),a=ee(),c=(0,s.sessionRegisterMessage)({programId:m.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPubkey:r.publicKey,maxAmount:K(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:a}),{signature:l,clientDataJSON:d,authenticatorData:h}=await this.passkey.signOperation(c),S=E(h,(0,U.sha256)(d)),p=(0,b.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,l,S),A=(0,u.sessionPdasOf)(await(0,u.fetchVaultSessionAccounts)(this.connection,this.vaultPdaKey)),w=await(0,u.resolveVaultUsdcAta)(this.connection,new o.PublicKey(this.swigAddress)),v=J({vaultPda:this.vaultPdaKey,swigAddress:new o.PublicKey(this.swigAddress),sessionPubkey:r.publicKey,maxAmount:K(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:a,clientDataJSON:d,authenticatorData:h,payer:this.feePayer.publicKey,siblingSessionPdas:A,vaultUsdcAta:w}),f=new o.Transaction().add(p,v);f.feePayer=this.feePayer.publicKey;let{blockhash:O}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);f.recentBlockhash=O,f.sign(this.feePayer);let $=await this.connection.sendRawTransaction(f.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});return await this.connection.confirmTransaction({signature:$,blockhash:O,lastValidBlockHeight:(await this.connection.getLatestBlockhash(this.confirmOptions.commitment)).lastValidBlockHeight},this.confirmOptions.commitment),await(0,u.waitForSession)(this.connection,this.vaultPdaKey,n,{expectedSessionPubkey:r.publicKey,timeoutMs:2e4}),D(r,t,c)}async signWithSession(t,n){let i=await te(n.channelId);return V(t,n,i)}async signOpenTab(t,n){return t.registration}async signCloseTab(t,n,i){let r=(0,s.sessionRevokeMessage)({programId:m.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPubkey:t.publicKey}),{signature:a,clientDataJSON:c,authenticatorData:l}=await this.passkey.signOperation(r),d=E(l,(0,U.sha256)(c)),h=(0,b.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,a,d),S=(0,y.buildRevokeSessionKeyInstruction)({vaultPda:this.vaultPdaKey,allowedCounterparty:new o.PublicKey(t.scope.allowedCounterparty),clientDataJSON:c,authenticatorData:l}),p=new o.Transaction().add(h,S);p.feePayer=this.feePayer.publicKey;let{blockhash:A,lastValidBlockHeight:w}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);p.recentBlockhash=A,p.sign(this.feePayer);let v=await this.connection.sendRawTransaction(p.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});return await this.connection.confirmTransaction({signature:v,blockhash:A,lastValidBlockHeight:w},this.confirmOptions.commitment),r}};function Z(e){return new k(e)}function E(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function ee(){return Math.floor(Math.random()*4294967295)>>>0}async function te(e){if(/^[0-9a-f]{64}$/i.test(e))return ne(e);let{sha256:t}=await import("@noble/hashes/sha256");return t(new TextEncoder().encode(e))}function ne(e){let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=parseInt(e.substr(n*2,2),16);return t}0&&(module.exports={buildAdapterRegisterInstruction,createSolanaVaultAdapter,deriveChannelId,passkeySignerFromP256Keypair});
|
|
@@ -112,6 +112,11 @@ interface AdapterRegisterIxParams {
|
|
|
112
112
|
payer: PublicKey;
|
|
113
113
|
/** V6: existing session PDAs for this vault — the overcommit aggregate gate. */
|
|
114
114
|
siblingSessionPdas: PublicKey[];
|
|
115
|
+
/** The vault swig-wallet's USDC ATA, or `null` for a credit-only vault whose
|
|
116
|
+
* ATA does not exist on-chain (own-USDC counted as 0). Resolve it through
|
|
117
|
+
* `@dexterai/vault`'s `resolveVaultUsdcAta` — the SINGLE source of truth for
|
|
118
|
+
* the derive-and-probe decision. The adapter no longer derives it locally. */
|
|
119
|
+
vaultUsdcAta: PublicKey | null;
|
|
115
120
|
}
|
|
116
121
|
declare function buildAdapterRegisterInstruction(p: AdapterRegisterIxParams): _solana_web3_js.TransactionInstruction;
|
|
117
122
|
/** Factory entry point. */
|
|
@@ -112,6 +112,11 @@ interface AdapterRegisterIxParams {
|
|
|
112
112
|
payer: PublicKey;
|
|
113
113
|
/** V6: existing session PDAs for this vault — the overcommit aggregate gate. */
|
|
114
114
|
siblingSessionPdas: PublicKey[];
|
|
115
|
+
/** The vault swig-wallet's USDC ATA, or `null` for a credit-only vault whose
|
|
116
|
+
* ATA does not exist on-chain (own-USDC counted as 0). Resolve it through
|
|
117
|
+
* `@dexterai/vault`'s `resolveVaultUsdcAta` — the SINGLE source of truth for
|
|
118
|
+
* the derive-and-probe decision. The adapter no longer derives it locally. */
|
|
119
|
+
vaultUsdcAta: PublicKey | null;
|
|
115
120
|
}
|
|
116
121
|
declare function buildAdapterRegisterInstruction(p: AdapterRegisterIxParams): _solana_web3_js.TransactionInstruction;
|
|
117
122
|
/** Factory entry point. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PublicKey as u,Transaction as
|
|
1
|
+
import{PublicKey as u,Transaction as V}from"@solana/web3.js";import{buildRegisterSessionKeyInstruction as w,buildRevokeSessionKeyInstruction as v,deriveSwigWalletAddress as te}from"@dexterai/vault/instructions";import{buildSecp256r1VerifyInstruction as P}from"@dexterai/vault/precompile";import{DEXTER_VAULT_PROGRAM_ID as b,SECP256R1_PROGRAM_ID as re,INSTRUCTIONS_SYSVAR_ID as se}from"@dexterai/vault/constants";import{sessionRegisterMessage as x,sessionRevokeMessage as U,voucherPayloadMessage as k,buildVoucherMessage as ce}from"@dexterai/vault/messages";import O from"tweetnacl";import{sha256 as N}from"@noble/hashes/sha256";function I(){let e=O.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function C(e,t,n){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:n}}function R(e,t,n){if(n.length!==32)throw new Error(`channelIdBytes must be 32 bytes, got ${n.length}`);let i=BigInt(t.cumulativeAmount),r=BigInt(e.scope.maxAmountAtomic);if(i>r)throw new Error(`voucher cumulative ${i} exceeds session cap ${r}`);let s=Math.floor(Date.now()/1e3);if(s>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${s}`);let a=k({channelId:n,cumulativeAmount:i,sequenceNumber:t.sequenceNumber}),o=O.sign.detached(a,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:o}}function g(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function _(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let n=new TextEncoder().encode(e.sellerUrl),i=N.create();return i.update(e.vaultPda.toBytes()),i.update(n),i.update(t),i.digest()}import{fetchVaultSessionAccounts as F,sessionPdasOf as z,waitForSession as G,resolveVaultUsdcAta as j}from"@dexterai/vault/session";import{sha256 as B}from"@noble/hashes/sha256";import{p256 as E}from"@noble/curves/p256";import{sha256 as d}from"@noble/hashes/sha256";var D="dexter.cash";function J(e){return Buffer.from(e).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function $(e,t=`https://${D}`){let i={type:"webauthn.get",challenge:J(e),origin:t,crossOrigin:!1};return new TextEncoder().encode(JSON.stringify(i))}function W(e=1){let t=d(new TextEncoder().encode(D)),n=new Uint8Array(37);return n.set(t,0),n[32]=5,new DataView(n.buffer).setUint32(33,e,!1),n}function H(e,t){let n=$(t),i=W(1),r=new Uint8Array(i.length+32);r.set(i,0),r.set(d(n),i.length);let s=d(r);return{signature:E.sign(s,e.privateKey,{lowS:!0}).toCompactRawBytes(),clientDataJSON:n,authenticatorData:i}}function L(e){return{credentialId:new Uint8Array(0),publicKey:e.publicKey,signOperation:async t=>H(e,d(t))}}function q(e){return w({vaultPda:e.vaultPda,sessionPubkey:e.sessionPubkey,maxAmount:e.maxAmount,maxRevolvingCapacity:e.maxRevolvingCapacity,expiresAt:e.expiresAt,allowedCounterparty:e.allowedCounterparty,nonce:e.nonce,swigAddress:e.swigAddress,vaultUsdcAta:e.vaultUsdcAta,clientDataJSON:e.clientDataJSON,authenticatorData:e.authenticatorData,payer:e.payer,siblingSessionPdas:e.siblingSessionPdas})}var K=class{network="solana:mainnet";swigAddress;vaultPda;connection;vaultPdaKey;passkey;feePayer;confirmOptions;constructor(t){this.connection=t.connection,this.swigAddress=typeof t.swigAddress=="string"?t.swigAddress:t.swigAddress.toBase58(),this.vaultPdaKey=typeof t.vaultPda=="string"?new u(t.vaultPda):t.vaultPda,this.vaultPda=this.vaultPdaKey.toBase58(),this.passkey=t.passkeySigner,this.feePayer=t.feePayer,this.confirmOptions=t.confirmOptions??{commitment:"confirmed"}}async authorizeSession(t){let n=new u(t.allowedCounterparty),i=g(t.revolvingCapacityAtomic??t.maxAmountAtomic),r=I(),s=X(),a=x({programId:b,vaultPda:this.vaultPdaKey,sessionPubkey:r.publicKey,maxAmount:g(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:s}),{signature:o,clientDataJSON:l,authenticatorData:y}=await this.passkey.signOperation(a),h=M(y,B(l)),c=P(this.passkey.publicKey,o,h),p=z(await F(this.connection,this.vaultPdaKey)),A=await j(this.connection,new u(this.swigAddress)),f=q({vaultPda:this.vaultPdaKey,swigAddress:new u(this.swigAddress),sessionPubkey:r.publicKey,maxAmount:g(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:s,clientDataJSON:l,authenticatorData:y,payer:this.feePayer.publicKey,siblingSessionPdas:p,vaultUsdcAta:A}),m=new V().add(c,f);m.feePayer=this.feePayer.publicKey;let{blockhash:S}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);m.recentBlockhash=S,m.sign(this.feePayer);let T=await this.connection.sendRawTransaction(m.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});return await this.connection.confirmTransaction({signature:T,blockhash:S,lastValidBlockHeight:(await this.connection.getLatestBlockhash(this.confirmOptions.commitment)).lastValidBlockHeight},this.confirmOptions.commitment),await G(this.connection,this.vaultPdaKey,n,{expectedSessionPubkey:r.publicKey,timeoutMs:2e4}),C(r,t,a)}async signWithSession(t,n){let i=await Y(n.channelId);return R(t,n,i)}async signOpenTab(t,n){return t.registration}async signCloseTab(t,n,i){let r=U({programId:b,vaultPda:this.vaultPdaKey,sessionPubkey:t.publicKey}),{signature:s,clientDataJSON:a,authenticatorData:o}=await this.passkey.signOperation(r),l=M(o,B(a)),y=P(this.passkey.publicKey,s,l),h=v({vaultPda:this.vaultPdaKey,allowedCounterparty:new u(t.scope.allowedCounterparty),clientDataJSON:a,authenticatorData:o}),c=new V().add(y,h);c.feePayer=this.feePayer.publicKey;let{blockhash:p,lastValidBlockHeight:A}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);c.recentBlockhash=p,c.sign(this.feePayer);let f=await this.connection.sendRawTransaction(c.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});return await this.connection.confirmTransaction({signature:f,blockhash:p,lastValidBlockHeight:A},this.confirmOptions.commitment),r}};function we(e){return new K(e)}function M(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function X(){return Math.floor(Math.random()*4294967295)>>>0}async function Y(e){if(/^[0-9a-f]{64}$/i.test(e))return Q(e);let{sha256:t}=await import("@noble/hashes/sha256");return t(new TextEncoder().encode(e))}function Q(e){let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=parseInt(e.substr(n*2,2),16);return t}export{q as buildAdapterRegisterInstruction,we as createSolanaVaultAdapter,_ as deriveChannelId,L as passkeySignerFromP256Keypair};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dexterai/x402",
|
|
3
|
-
"version": "5.0
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "Full-stack x402 SDK - add paid API monetization to any endpoint. Express middleware, React hooks, Access Pass, dynamic pricing. Solana, Base, Polygon, Arbitrum, Optimism, Avalanche, SKALE.",
|
|
5
5
|
"author": "Dexter",
|
|
6
6
|
"license": "MIT",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"tweetnacl": "^1.0.3"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
|
-
"@dexterai/vault": "^0.
|
|
92
|
+
"@dexterai/vault": "^0.20.0",
|
|
93
93
|
"@types/aws-lambda": "^8.10.161",
|
|
94
94
|
"@types/express": "^5.0.6",
|
|
95
95
|
"@types/node": "^22.10.0",
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
"vitest": "^2.1.8"
|
|
105
105
|
},
|
|
106
106
|
"peerDependencies": {
|
|
107
|
-
"@dexterai/vault": ">=0.
|
|
107
|
+
"@dexterai/vault": ">=0.20.0",
|
|
108
108
|
"@solana/wallet-adapter-base": "^0.9.0",
|
|
109
109
|
"react": "^18.0.0 || ^19.0.0",
|
|
110
110
|
"stripe": "^20.0.0",
|