@dexterai/x402 3.1.1 → 3.2.1
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 +25 -6
- package/assets/x402gle-by-dexter.svg +49 -0
- package/assets/x402gle-wordmark.svg +22 -0
- package/dist/adapters/index.cjs +1 -1
- package/dist/adapters/index.d.cts +4 -3
- package/dist/adapters/index.d.ts +4 -3
- package/dist/adapters/index.js +1 -1
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.d.cts +6 -7
- package/dist/client/index.d.ts +6 -7
- package/dist/client/index.js +1 -1
- package/dist/constants-qU-4U3L-.d.cts +52 -0
- package/dist/constants-qU-4U3L-.d.ts +52 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.cts +5 -5
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +1 -1
- package/dist/server/index.cjs +15 -15
- package/dist/server/index.d.cts +3 -2
- package/dist/server/index.d.ts +3 -2
- package/dist/server/index.js +17 -17
- package/dist/{sponsored-access-BVoucsEW.d.ts → sponsored-access-BuecDKXL.d.cts} +2 -3
- package/dist/{sponsored-access-CE7WpV5b.d.cts → sponsored-access-DP61rXDl.d.ts} +2 -3
- package/dist/{types-DBS0XOsH.d.ts → types-BPKUVJEl.d.ts} +2 -46
- package/dist/{types-_iT11DL0.d.cts → types-CKiTYeJ-.d.cts} +3 -12
- package/dist/{types-_iT11DL0.d.ts → types-CKiTYeJ-.d.ts} +3 -12
- package/dist/{types-C_aQh02s.d.cts → types-i7C2GiVY.d.cts} +2 -46
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +15 -1
- package/dist/utils/index.d.ts +15 -1
- package/dist/utils/index.js +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">@dexterai/x402</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>Full-stack x402 SDK. Add paid API monetization to any endpoint. Solana, Base,
|
|
8
|
+
<strong>Full-stack x402 SDK. Add paid API monetization to any endpoint. Solana, Base, Polygon, Arbitrum, Optimism, Avalanche, BSC, and SKALE.</strong>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
@@ -41,7 +41,7 @@ This SDK handles the entire flow automatically—you just call `fetch()` and pay
|
|
|
41
41
|
|
|
42
42
|
**Full-stack.** Client SDK for browsers, server SDK for backends. React hooks, Express middleware patterns, facilitator client—everything you need.
|
|
43
43
|
|
|
44
|
-
**Multi-chain.** Solana
|
|
44
|
+
**Multi-chain.** Solana plus seven EVM chains (Base, Polygon, Arbitrum, Optimism, Avalanche, BSC, SKALE Base) with the same API. Add wallets for both families and the SDK picks the right one automatically.
|
|
45
45
|
|
|
46
46
|
**Works out of the box.** Built-in RPC proxy, pre-flight balance checks, automatic retry on 402. Uses the [Dexter facilitator](https://x402.dexter.cash) by default—Solana's most feature-rich x402 facilitator.
|
|
47
47
|
|
|
@@ -190,6 +190,7 @@ All networks supported by the [Dexter facilitator](https://x402.dexter.cash/supp
|
|
|
190
190
|
| Arbitrum | `eip155:42161` | Production |
|
|
191
191
|
| Optimism | `eip155:10` | Production |
|
|
192
192
|
| Avalanche | `eip155:43114` | Production |
|
|
193
|
+
| BSC | `eip155:56` | Production |
|
|
193
194
|
| SKALE Base | `eip155:1187947933` | Production (zero gas) |
|
|
194
195
|
|
|
195
196
|
**Testnets:**
|
|
@@ -197,17 +198,26 @@ All networks supported by the [Dexter facilitator](https://x402.dexter.cash/supp
|
|
|
197
198
|
| Network | CAIP-2 |
|
|
198
199
|
|---------|--------|
|
|
199
200
|
| Solana Devnet | `solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1` |
|
|
201
|
+
| Solana Testnet | `solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z` |
|
|
200
202
|
| Base Sepolia | `eip155:84532` |
|
|
201
|
-
| SKALE Sepolia | `eip155:324705682` |
|
|
203
|
+
| SKALE Base Sepolia | `eip155:324705682` |
|
|
202
204
|
|
|
203
205
|
Accept payments on multiple chains simultaneously:
|
|
204
206
|
|
|
205
207
|
```typescript
|
|
206
|
-
// Same address across EVM chains
|
|
208
|
+
// Same address across all EVM chains
|
|
207
209
|
app.get('/api/data', x402Middleware({
|
|
208
210
|
payTo: '0xYourAddress',
|
|
209
211
|
amount: '0.01',
|
|
210
|
-
network: [
|
|
212
|
+
network: [
|
|
213
|
+
'eip155:8453', // Base
|
|
214
|
+
'eip155:137', // Polygon
|
|
215
|
+
'eip155:42161', // Arbitrum
|
|
216
|
+
'eip155:10', // Optimism
|
|
217
|
+
'eip155:43114', // Avalanche
|
|
218
|
+
'eip155:56', // BSC
|
|
219
|
+
'eip155:1187947933', // SKALE Base (zero gas)
|
|
220
|
+
],
|
|
211
221
|
}));
|
|
212
222
|
|
|
213
223
|
// Different addresses per chain family
|
|
@@ -217,7 +227,16 @@ app.get('/api/data', x402Middleware({
|
|
|
217
227
|
'eip155:*': '0xYourEvmAddress...',
|
|
218
228
|
},
|
|
219
229
|
amount: '0.01',
|
|
220
|
-
network: [
|
|
230
|
+
network: [
|
|
231
|
+
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
|
|
232
|
+
'eip155:8453',
|
|
233
|
+
'eip155:137',
|
|
234
|
+
'eip155:42161',
|
|
235
|
+
'eip155:10',
|
|
236
|
+
'eip155:43114',
|
|
237
|
+
'eip155:56',
|
|
238
|
+
'eip155:1187947933',
|
|
239
|
+
],
|
|
221
240
|
}));
|
|
222
241
|
```
|
|
223
242
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 240" role="img" aria-label="x402gle by Dexter">
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="dexterGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#d13f00" />
|
|
6
|
+
<stop offset="42%" stop-color="#ff6b00" />
|
|
7
|
+
<stop offset="100%" stop-color="#ffb42c" />
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<style><![CDATA[
|
|
10
|
+
@font-face {
|
|
11
|
+
font-family: 'X402gleJakarta';
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-weight: 700;
|
|
14
|
+
src: url(data:font/woff2;base64,d09GMgABAAAAAATYAA8AAAAACOAAAAR/AAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAbBEICoYkhSMBNgIkAygLFgAEIAWEZgcgG0IHUVRRIgC+SLCpiHsuNpoiUrSljaJMlstVmsruw+HhQ/rfCL7f73XPfRBCyahRAVkAtJnY6EiZiSzaelKdClf55/tOmwmqKeDLBq4Ys+b2JdsD5CTnL4CIcNtPl6NWhF7R/wDXD5EhR55KQG2J2CeOmS4aR9NsoaFmYqZFte8mttEAo63/Hwuk6b35yeR1G9LzAdzQ0i+Txx9KoB6QhFAKgVodEsGlFbUZ+MihIgBDZwgNabzAp3OiF0QjgZbn6TkdRyW9dQ+wOR8nTtAio/jDv9fWVunAalxDZmAlQNEMmwEBqYf0BtCDLIRqCe1IGEB6uW0nIJn709ANkZBrBiFq0gcgE1LUgwAJGdqRBdpR7AFaBSNLZvAJNWrRptuQL37A4N/g3FxWWWG5xWYEKZ4QFS2oWl/bDmjAf+ISAPmpoJMQ2zc6PSKYlh5MCYwKDk5A1IapbnYc8KMiEn2XB01zucDo+/et0zweOMbt9ptqU4DRLlfDVDMc48EI7tTF4f4wQL3KfbNgrt9PWR2Cpt1iWJbjhVgM27bCNeHaOQix3ff9FoewmBBRRuPklVUYH3Zzf0RFFFRViSx+NmSv8LMis2XqwUy44ACadirJZq5Ffk8Vqt79SOJVTzQEQds9zz6v4i4NJFvXgW+91BwAAqA/bEMkBPxAIz+AnNWCChrZ1650DPsxriz/WB23RDNMJR+l18nGDFPWDGJJsEwFl5spl9BZDLGNUHLkivnjBcXIPEIlGaMzSkcOVahL6zGRIq02J5CVv7658tmMWNkVBvY7WZvDS1WLMRbrRVKH4KeooDoFiB8XtQ1QSoOGsA5I2ULajWja8Bm7a3iF6kES0RC1RjSoX6wqquZ/Ch48nCoT4wNLTJ3052llDHp6+QsMK8sgOV22KCvNAEU/xv0A9SeCTwYunf9YMnAuORF4PHjJ3EeiPcDIx5ELfXrOSoJZk7+kmWDPe+uMDUf464/M5OmiAoU2EzSgigl1yh1OQrGNDquoGl+n2u50KrdPqLcPE8iKMwmDIZOQFwn5siIB6t9mCWC3Xbl7slS5IJ6zgc2VZH8fmH5UYe1kF8q7BYU1JbQETYH+y85DIicYut7q0Nydea/H0bN+0HMvfbXtYwAEUitLNcG1tW6FP6pH9g/g5x5mNAD82TSvWp9iVP5dlJKVkp9W/h2BuB8CUrvUpleFXa2ozQZ0ugH+20E2QGlDft4nubXAOlM6iFpXvB2hxsrMBOq8WXl5DT4BUImhz3liUu0vMbPoIzE3ESaxMBs7oTSSuUyRqY/3lprLEHXvoF9Oq1cbP4jg+gzh0KFNO0IyPu5oTGb2Aluo9br1cwaVGnSVoAOhgYEmcy8nLtMB16lFUySDslXRhHY4B8ZAs8NChD5O+Tg42nT06/ZrxNYE14ODgOuCIwzRpwUng/Ima/1iGf4t5XDdmvGxceXgKWCmo6JTsIeWFaHuLyHDY61aOEZ3wPVK3j26TSsCzh+PUxUutjxsAlw1GdltWs5tsQKhQbcOTYxwPf3dyEBlaBQAAA==) format('woff2');
|
|
15
|
+
}
|
|
16
|
+
@font-face {
|
|
17
|
+
font-family: 'DexterOrbitron';
|
|
18
|
+
font-style: normal;
|
|
19
|
+
font-weight: 800;
|
|
20
|
+
src: url(data:font/truetype;base64,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) format('truetype');
|
|
21
|
+
}
|
|
22
|
+
.wm {
|
|
23
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
letter-spacing: -0.02em;
|
|
26
|
+
font-size: 140px;
|
|
27
|
+
}
|
|
28
|
+
.by {
|
|
29
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
30
|
+
font-weight: 700;
|
|
31
|
+
font-size: 18px;
|
|
32
|
+
fill: #888;
|
|
33
|
+
}
|
|
34
|
+
.dexter {
|
|
35
|
+
font-family: 'DexterOrbitron', 'Orbitron', sans-serif;
|
|
36
|
+
font-weight: 800;
|
|
37
|
+
letter-spacing: 0.01em;
|
|
38
|
+
font-size: 32px;
|
|
39
|
+
}
|
|
40
|
+
]]></style>
|
|
41
|
+
</defs>
|
|
42
|
+
<text class="wm" x="300" y="120" text-anchor="middle">
|
|
43
|
+
<tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
|
|
44
|
+
</text>
|
|
45
|
+
<g transform="translate(300, 200)">
|
|
46
|
+
<text class="by" x="-72" y="0" text-anchor="end">by</text>
|
|
47
|
+
<text class="dexter" x="-60" y="4" fill="url(#dexterGradient)">DEXTER</text>
|
|
48
|
+
</g>
|
|
49
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 573 157" role="img" aria-label="x402gle wordmark">
|
|
3
|
+
<defs>
|
|
4
|
+
<style><![CDATA[
|
|
5
|
+
@font-face {
|
|
6
|
+
font-family: 'X402gleJakarta';
|
|
7
|
+
font-style: normal;
|
|
8
|
+
font-weight: 700;
|
|
9
|
+
src: url(data:font/woff2;base64,d09GMgABAAAAAAQ4AA8AAAAACAgAAAPfAAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAZBEICoRghAkBNgIkAyALEgAEIAWEZgcgG5gGAB6D424plMVSBvOu5PJojxZB/X5lz/tv6f7esQwjSVLExrBwcajYJpJVKsJEJvvXd9brYAFGnHgJTSrT2QOk4PwFqf8BqkVOXI7/Nz/9425MwdTWwLamY03vEuspzLfP84CjaINtIArYU9X5VOWAgjPqDIHYl0ATkISQhUCbfkKgZStySsBOhtb/AI6CEURo4lzOHcZ94McETM/pQjoKTNIDWgWwVhcTB4giHeiGv8a2jdn5sBKUBmaX1kClC7UAAWkQ7SUGoQuhLqEPDcPQLp3swIjO6fONPchRyLogiEZ6BaAQUjRBgIQCfegCfRg2AV3c0DGJmlardj0Gtv57z+tM7lhqiQWmhsBmIVrqBHXQBbThJUA/AXKEMUkipOVG8dwYLl1uwY7Mww8slhhltZZTzLCMawu9nFD7uoeW622Tr5oGrzSb98JuSEuXmkxcckL5MvOIK2cCjd5pcghOlsuQY75mMu3hu60x6qFMJtdOY5a53LvHsbStvKzY7VBWllQ0iiJ2TLFiliDa+cX63Gu8PfpYZWvIP2VRiTO0RzNOlrRSmyNTnOnT4xxLLmenjsovShs+ODMnoUGcnMmtC3eRR61tqXo8LSD9klT8g5UXruLkpIjl8qehnZpvydE1bEj5GtsuzEpzHTR+XxqhFV3zEw2dtrNWFZMzIDV5UE5u8gBjSnZsjfq928ChzPRlZH98cZfkCTdRKuElPRWLE/mqQWIukZjAh9i/Y75yeu123GXx3AepQnvRMZejbotm308eC4fLytv1WdsonLnlXq6yemx99laKyto6rqFiiCY9ToALC8+QjFitOj3WBgoOOh6Ik5duv0nImhekWEcoU8O+9PMOZ5Z1ETEZPZqY2nhRcG50wcftB5IpGPyszJB7e/qdXkPv2gFP9A4dYwAgkHrkn/dM5dW7xny1oxd/4PsumR8AvzbMqflf/v8/c0T+AqlKIPglDJ8Y+L+OARD4dvV0DWJSC2GaCkJ/xCYCHNNbs1IpcZoOPAh1x9jah5kjvRAoPbBycgNvwcGHIc7ySd1vvrDAOz4bFzK+Yk5UcFWjYrZKFJrxoqmRyxnlHvJ+taa2+Gwpkt4gBp3adcBY1JTSxVLiBVplC/QwokKzNOrWGGPEGslSzN2H4q3AgNSlVTOMJZER1oFk4DhFKkyE6VGiKCi061y7GjUhNCP1UsBI3UjYIHqtFB2UTv3sVdzhY0lC6tFCjaAUTiVaiXzZ8kXXsMkz1Pwm9Hy6TCvD8E6kPqzqke3aYOR1fyjVlAiRCBpKtR0FyrV+t8mZsEY9OjUrQupdR6MDrVYiAAAA) format('woff2');
|
|
10
|
+
}
|
|
11
|
+
.wm {
|
|
12
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
13
|
+
font-weight: 700;
|
|
14
|
+
letter-spacing: -0.02em;
|
|
15
|
+
font-size: 140px;
|
|
16
|
+
}
|
|
17
|
+
]]></style>
|
|
18
|
+
</defs>
|
|
19
|
+
<text class="wm" x="286.5" y="116" text-anchor="middle">
|
|
20
|
+
<tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
|
|
21
|
+
</text>
|
|
22
|
+
</svg>
|
package/dist/adapters/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var it=Object.create;var H=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var pt=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var ft=(r,t)=>{for(var e in t)H(r,e,{get:t[e],enumerable:!0})},ot=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of dt(t))!ut.call(r,a)&&a!==e&&H(r,a,{get:()=>t[a],enumerable:!(o=ct(t,a))||o.enumerable});return r};var X=(r,t,e)=>(e=r!=null?it(pt(r)):{},ot(t||!r||!r.__esModule?H(e,"default",{value:r,enumerable:!0}):e,r)),lt=r=>ot(H({},"__esModule",{value:!0}),r);var Et={};ft(Et,{ARBITRUM_ONE:()=>P,AVALANCHE:()=>J,BASE_MAINNET:()=>b,BASE_SEPOLIA:()=>O,BSC_MAINNET:()=>x,BSC_STABLECOIN_ADDRESSES:()=>et,BSC_USDC:()=>Q,BSC_USDT:()=>rt,ETHEREUM_MAINNET:()=>B,EvmAdapter:()=>q,OPTIMISM:()=>V,PERMIT2_ADDRESS:()=>U,POLYGON:()=>$,SKALE_BASE:()=>z,SKALE_BASE_SEPOLIA:()=>G,SOLANA_DEVNET:()=>F,SOLANA_MAINNET:()=>k,SOLANA_TESTNET:()=>j,SolanaAdapter:()=>K,USDC_ADDRESSES:()=>tt,X402_EXACT_PERMIT2_PROXY:()=>Z,createDefaultAdapters:()=>At,createEvmAdapter:()=>nt,createSolanaAdapter:()=>Y,findAdapter:()=>St,isEvmWallet:()=>M,isKnownUSDC:()=>yt,isSolanaWallet:()=>N});module.exports=lt(Et);var f=require("@solana/web3.js"),u=require("@solana/spl-token"),k="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",F="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",j="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",_={[k]:"https://api.dexter.cash/api/solana/rpc",[F]:"https://api.devnet.solana.com",[j]:"https://api.testnet.solana.com"},mt=12e3,gt=1;function N(r){if(!r||typeof r!="object")return!1;let t=r;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var K=class{name="Solana";networks=[k,F,j];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:_[t]?_[t]:t==="solana"?_[k]:t==="solana-devnet"?_[F]:t==="solana-testnet"?_[j]:_[k]}getAddress(t){return N(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return N(t)?t.publicKey!==null:!1}async getBalance(t,e,o){if(!N(e)||!e.publicKey)return 0;let a=o||this.getDefaultRpcUrl(t.network),n=new f.Connection(a,"confirmed"),c=new f.PublicKey(e.publicKey.toBase58()),s=new f.PublicKey(t.asset);try{let d=(await n.getAccountInfo(s,"confirmed"))?.owner.toBase58()===u.TOKEN_2022_PROGRAM_ID.toBase58()?u.TOKEN_2022_PROGRAM_ID:u.TOKEN_PROGRAM_ID,p=await(0,u.getAssociatedTokenAddress)(s,c,!1,d),y=await(0,u.getAccount)(n,p,void 0,d),l=t.extra?.decimals??6;return Number(y.amount)/Math.pow(10,l)}catch(i){if(i&&typeof i=="object"&&"name"in i&&(i.name==="TokenAccountNotFoundError"||i.name==="TokenInvalidAccountOwnerError"))return 0;throw i}}async buildTransaction(t,e,o){if(!N(e))throw new Error("Invalid Solana wallet");if(!e.publicKey)throw new Error("Wallet not connected");let a=o||this.getDefaultRpcUrl(t.network),n=new f.Connection(a,"confirmed"),c=new f.PublicKey(e.publicKey.toBase58()),{payTo:s,asset:i,extra:d}=t,p=t.amount??t.maxAmountRequired;if(!p)throw new Error("Missing amount in payment requirements");if(!d?.feePayer)throw new Error("Missing feePayer in payment requirements");let y=new f.PublicKey(d.feePayer),l=new f.PublicKey(i),m=new f.PublicKey(s);this.log("Building transaction:",{from:c.toBase58(),to:s,amount:p,asset:i,feePayer:d.feePayer});let g=[];g.push(f.ComputeBudgetProgram.setComputeUnitLimit({units:mt})),g.push(f.ComputeBudgetProgram.setComputeUnitPrice({microLamports:gt}));let E=await n.getAccountInfo(l,"confirmed");if(!E)throw new Error(`Token mint ${i} not found`);let h=E.owner.toBase58()===u.TOKEN_2022_PROGRAM_ID.toBase58()?u.TOKEN_2022_PROGRAM_ID:u.TOKEN_PROGRAM_ID,v=await(0,u.getMint)(n,l,void 0,h);typeof d?.decimals=="number"&&v.decimals!==d.decimals&&this.log(`Decimals mismatch: requirements say ${d.decimals}, mint says ${v.decimals}`);let A=await(0,u.getAssociatedTokenAddress)(l,c,!1,h),S=await(0,u.getAssociatedTokenAddress)(l,m,!1,h);if(!await n.getAccountInfo(A,"confirmed"))throw new Error(`No token account found for ${i}. Please ensure you have USDC in your wallet.`);if(!await n.getAccountInfo(S,"confirmed"))throw new Error(`Seller token account not found. The seller (${s}) must have a USDC account.`);let L=BigInt(p);g.push((0,u.createTransferCheckedInstruction)(A,l,S,c,L,v.decimals,[],h));let{blockhash:D}=await n.getLatestBlockhash("confirmed"),W=new f.TransactionMessage({payerKey:y,recentBlockhash:D,instructions:g}).compileToV0Message(),w=new f.VersionedTransaction(W),R=await e.signTransaction(w);return this.log("Transaction signed successfully"),{serialized:Buffer.from(R.serialize()).toString("base64")}}};function Y(r){return new K(r)}var U="0x000000000022D473030F116dDEE9F6B43aC78BA3",Z="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",ht={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},at=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),b="eip155:8453",O="eip155:84532",P="eip155:42161",$="eip155:137",V="eip155:10",J="eip155:43114",x="eip155:56",z="eip155:1187947933",G="eip155:324705682",B="eip155:1",rt="0x55d398326f99059fF775485246999027B3197955",Q="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",st={[x]:56,[b]:8453,[O]:84532,[P]:42161,[$]:137,[V]:10,[J]:43114,[z]:1187947933,[G]:324705682,[B]:1},C={[x]:"https://bsc-dataseed1.binance.org",[b]:"https://api.dexter.cash/api/base/rpc",[O]:"https://sepolia.base.org",[P]:"https://arb1.arbitrum.io/rpc",[$]:"https://polygon-rpc.com",[V]:"https://mainnet.optimism.io",[J]:"https://api.avax.network/ext/bc/C/rpc",[z]:"https://skale-base.skalenodes.com/v1/base",[G]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[B]:"https://eth.llamarpc.com"},tt={[x]:Q,[b]:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",[O]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[P]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[$]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[V]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[J]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[z]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[G]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[B]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},et={[rt]:{symbol:"USDT",decimals:18},[Q]:{symbol:"USDC",decimals:18}};function M(r){if(!r||typeof r!="object")return!1;let t=r;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var q=class{name="EVM";networks=[x,b,O,B,P];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:C[t]?C[t]:t==="base"?C[b]:t==="bsc"?C[x]:t==="ethereum"?C[B]:t==="arbitrum"?C[P]:C[b]}getAddress(t){return M(t)?t.address:null}isConnected(t){return M(t)?!!t.address:!1}getChainId(t){if(st[t])return st[t];if(t.startsWith("eip155:")){let e=t.split(":")[1];return parseInt(e,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:8453}async getBalance(t,e,o){if(!M(e)||!e.address)return 0;let a=o||this.getDefaultRpcUrl(t.network);try{let n=this.encodeBalanceOf(e.address),c=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.asset,data:n},"latest"]})});if(!c.ok)throw new Error(`RPC request failed: ${c.status}`);let s=await c.json();if(s.error)throw new Error(`RPC error: ${JSON.stringify(s.error)}`);if(!s.result||s.result==="0x")return 0;let i=BigInt(s.result),d=t.extra?.decimals??6;return Number(i)/Math.pow(10,d)}catch(n){throw n}}encodeBalanceOf(t){let e="0x70a08231",o=t.slice(2).toLowerCase().padStart(64,"0");return e+o}async buildTransaction(t,e,o){if(!M(e))throw new Error("Invalid EVM wallet");if(!e.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,e,o);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,e,o);let{payTo:a,asset:n,extra:c}=t,s=t.amount??t.maxAmountRequired;if(!s)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:e.address,to:a,amount:s,asset:n,network:t.network});let i=this.getChainId(t.network),d={name:c?.name??"USD Coin",version:c?.version??"2",chainId:BigInt(i),verifyingContract:n},p={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},y=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(y);let l="0x"+[...y].map(A=>A.toString(16).padStart(2,"0")).join(""),m=Math.floor(Date.now()/1e3),g={from:e.address,to:a,value:s,validAfter:String(m-600),validBefore:String(m+(t.maxTimeoutSeconds||60)),nonce:l},E={from:e.address,to:a,value:BigInt(s),validAfter:BigInt(m-600),validBefore:BigInt(m+(t.maxTimeoutSeconds||60)),nonce:l};if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let h=await e.signTypedData({domain:d,types:p,primaryType:"TransferWithAuthorization",message:E});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:g,signature:h}),signature:h}}async buildApprovalTransaction(t,e,o){let{payTo:a,asset:n,extra:c}=t,s=t.amount??t.maxAmountRequired;if(!s)throw new Error("Missing amount in payment requirements");let i=c?.facilitatorContract;if(!i)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:e.address,to:a,amount:s,asset:n,network:t.network,facilitatorContract:i});let d=o||this.getDefaultRpcUrl(t.network),p=c?.fee??"0",y=BigInt(s)+BigInt(p),l=await this.readAllowance(d,n,e.address,i);if(l<y){if(!e.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let w=this.calculateApprovalAmount(s,p,c?.approvalStrategy);this.log(`Approving ${w} for ${i} (current allowance: ${l})`);let R=await e.sendTransaction({to:n,data:this.encodeApprove(i,w),value:0n});this.log(`Approval tx sent: ${R}`),await this.waitForReceipt(d,R),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let m=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(m);let g=[...m].reduce((w,R)=>w*256n+BigInt(R),0n).toString(),E=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(E);let h="0x"+[...E].map(w=>w.toString(16).padStart(2,"0")).join(""),A=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),S=c?.eip712Domain,I=S?{name:S.name,version:S.version,chainId:BigInt(S.chainId),verifyingContract:S.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:i},T=c?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},L={from:e.address,to:a,token:n,amount:BigInt(s),fee:BigInt(p),nonce:BigInt(g),deadline:BigInt(A),paymentId:h},D=await e.signTypedData({domain:I,types:T,primaryType:"Payment",message:L});this.log("EIP-712 Payment signature obtained");let W={from:e.address,to:a,token:n,amount:s,fee:p,nonce:g,deadline:A,paymentId:h,signature:D};return{serialized:JSON.stringify(W),signature:D}}async buildPermit2Transaction(t,e,o){let{payTo:a,asset:n}=t,c=t.amount??t.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:e.address,to:a,amount:c,asset:n,network:t.network});let s=o||this.getDefaultRpcUrl(t.network),i=await this.readAllowance(s,n,e.address,U),d;if(i<BigInt(c)){let I=this.encodeApprove(U,at);if(e.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${i})`);let T=this.getChainId(t.network),L=await this.readGasPrice(s),D=await this.readNonce(s,e.address),W=await e.signTransaction({to:n,data:I,chainId:T,gas:50000n,gasPrice:L,nonce:D});d={erc20ApprovalGasSponsoring:{info:{from:e.address,asset:n,spender:U,amount:at.toString(),signedTransaction:W,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(e.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${i})`);let T=await e.sendTransaction({to:n,data:I,value:0n});this.log(`Permit2 approval tx sent: ${T}`),await this.waitForReceipt(s,T),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let y=[...p].reduce((I,T)=>I*256n+BigInt(T),0n),l=Math.floor(Date.now()/1e3),m=l-600,g=l+(t.maxTimeoutSeconds||300),E=this.getChainId(t.network),h={name:"Permit2",chainId:BigInt(E),verifyingContract:U},v={permitted:{token:n,amount:BigInt(c)},spender:Z,nonce:y,deadline:BigInt(g),witness:{to:a,validAfter:BigInt(m)}},A=await e.signTypedData({domain:h,types:ht,primaryType:"PermitWitnessTransferFrom",message:v});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let S={signature:A,permit2Authorization:{from:e.address,permitted:{token:n,amount:c},spender:Z,nonce:y.toString(),deadline:String(g),witness:{to:a,validAfter:String(m)}}};return{serialized:JSON.stringify(S),signature:A,extensions:d}}async readAllowance(t,e,o,a){let n="0xdd62ed3e",c=o.slice(2).toLowerCase().padStart(64,"0"),s=a.slice(2).toLowerCase().padStart(64,"0"),i=n+c+s;try{let p=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e,data:i},"latest"]})})).json();return p.error||!p.result||p.result==="0x"?0n:BigInt(p.result)}catch{return 0n}}encodeApprove(t,e){let o="0x095ea7b3",a=t.slice(2).toLowerCase().padStart(64,"0"),n=e.toString(16).padStart(64,"0");return o+a+n}async waitForReceipt(t,e,o=3e4){let a=Date.now();for(;Date.now()-a<o;){try{let c=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[e]})})).json();if(c.result){if(c.result.status==="0x0")throw new Error(`Approval transaction reverted: ${e}`);return}}catch(n){if(n instanceof Error&&n.message.includes("reverted"))throw n}await new Promise(n=>setTimeout(n,2e3))}throw new Error(`Approval transaction receipt timeout after ${o}ms: ${e}`)}async readGasPrice(t){try{let o=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return o.result?BigInt(o.result):50000000n}catch{return 50000000n}}async readNonce(t,e){try{let a=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[e,"latest"]})})).json();return a.result?parseInt(a.result,16):0}catch{return 0}}calculateApprovalAmount(t,e,o){let a=BigInt(t)+BigInt(e);if(!o||o.mode==="exact")return a;let n=BigInt(o.defaultMultiple??10),c=a*n;if(o.maxCapUsd){let s=this.inferDecimals(t),i=BigInt(Math.floor(o.maxCapUsd*Math.pow(10,s)));if(c>i)return i}if(o.exactAboveUsd){let s=this.inferDecimals(t),i=BigInt(Math.floor(o.exactAboveUsd*Math.pow(10,s)));if(BigInt(t)>i)return a}return c}inferDecimals(t){return t.length>12?18:6}};function nt(r){return new q(r)}function yt(r){if(r==="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"||r==="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU")return!0;let t=r.toLowerCase();for(let e of Object.values(tt))if(e.toLowerCase()===t)return!0;for(let e of Object.keys(et))if(e.toLowerCase()===t)return!0;return!1}function At(r=!1){return[Y({verbose:r}),nt({verbose:r})]}function St(r,t){return r.find(e=>e.canHandle(t))}0&&(module.exports={ARBITRUM_ONE,AVALANCHE,BASE_MAINNET,BASE_SEPOLIA,BSC_MAINNET,BSC_STABLECOIN_ADDRESSES,BSC_USDC,BSC_USDT,ETHEREUM_MAINNET,EvmAdapter,OPTIMISM,PERMIT2_ADDRESS,POLYGON,SKALE_BASE,SKALE_BASE_SEPOLIA,SOLANA_DEVNET,SOLANA_MAINNET,SOLANA_TESTNET,SolanaAdapter,USDC_ADDRESSES,X402_EXACT_PERMIT2_PROXY,createDefaultAdapters,createEvmAdapter,createSolanaAdapter,findAdapter,isEvmWallet,isKnownUSDC,isSolanaWallet});
|
|
1
|
+
"use strict";var It=Object.create;var Q=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var wt=Object.getPrototypeOf,bt=Object.prototype.hasOwnProperty;var Nt=(r,t)=>{for(var e in t)Q(r,e,{get:t[e],enumerable:!0})},gt=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ct(t))!bt.call(r,s)&&s!==e&&Q(r,s,{get:()=>t[s],enumerable:!(o=_t(t,s))||o.enumerable});return r};var tt=(r,t,e)=>(e=r!=null?It(wt(r)):{},gt(t||!r||!r.__esModule?Q(e,"default",{value:r,enumerable:!0}):e,r)),xt=r=>gt(Q({},"__esModule",{value:!0}),r);var Lt={};Nt(Lt,{ARBITRUM_ONE:()=>O,AVALANCHE:()=>U,BASE_MAINNET:()=>x,BASE_SEPOLIA:()=>X,BSC_MAINNET:()=>k,BSC_STABLECOIN_ADDRESSES:()=>J,BSC_USDC:()=>G,BSC_USDT:()=>ut,ETHEREUM_MAINNET:()=>F,EvmAdapter:()=>Z,OPTIMISM:()=>L,PERMIT2_ADDRESS:()=>C,POLYGON:()=>M,SKALE_BASE:()=>W,SKALE_BASE_SEPOLIA:()=>K,SOLANA_DEVNET:()=>B,SOLANA_MAINNET:()=>N,SOLANA_TESTNET:()=>D,SolanaAdapter:()=>z,USDC_ADDRESSES:()=>Y,X402_EXACT_PERMIT2_PROXY:()=>V,createDefaultAdapters:()=>Ot,createEvmAdapter:()=>lt,createSolanaAdapter:()=>ft,findAdapter:()=>Mt,isEvmWallet:()=>q,isKnownUSDC:()=>Dt,isSolanaWallet:()=>j});module.exports=xt(Lt);var f=require("@solana/web3.js"),u=require("@solana/spl-token");var At="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Et="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",St="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",N=At,B=Et,D=St,et="eip155:8453",nt="eip155:84532",rt="eip155:42161",ot="eip155:137",st="eip155:10",at="eip155:43114",it="eip155:56",ct="eip155:1187947933",pt="eip155:324705682",dt="eip155:1",x=et,X=nt,O=rt,M=ot,L=st,U=at,k=it,W=ct,K=pt,F=dt,Tt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",ht="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",Pt="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",ut="0x55d398326f99059fF775485246999027B3197955",G="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",Y={[it]:G,[et]:Pt,[nt]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[rt]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ot]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[st]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[at]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[ct]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[pt]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[dt]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},J={[ut]:{symbol:"USDT",decimals:18},[G]:{symbol:"USDC",decimals:18}};var C="0x000000000022D473030F116dDEE9F6B43aC78BA3",V="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",mt={[it]:56,[et]:8453,[nt]:84532,[rt]:42161,[ot]:137,[st]:10,[at]:43114,[ct]:1187947933,[pt]:324705682,[dt]:1},P={[At]:"https://api.dexter.cash/api/solana/rpc",[Et]:"https://api.devnet.solana.com",[St]:"https://api.testnet.solana.com"},m={[it]:"https://bsc-dataseed1.binance.org",[et]:"https://api.dexter.cash/api/base/rpc",[nt]:"https://sepolia.base.org",[rt]:"https://arb1.arbitrum.io/rpc",[ot]:"https://polygon-rpc.com",[st]:"https://mainnet.optimism.io",[at]:"https://api.avax.network/ext/bc/C/rpc",[ct]:"https://skale-base.skalenodes.com/v1/base",[pt]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[dt]:"https://eth.llamarpc.com"};var Rt=12e3,vt=1;function j(r){if(!r||typeof r!="object")return!1;let t=r;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var z=class{name="Solana";networks=[N,B,D];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:P[t]?P[t]:t==="solana"?P[N]:t==="solana-devnet"?P[B]:t==="solana-testnet"?P[D]:P[N]}getAddress(t){return j(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return j(t)?t.publicKey!==null:!1}async getBalance(t,e,o){if(!j(e)||!e.publicKey)return 0;let s=o||this.getDefaultRpcUrl(t.network),n=new f.Connection(s,"confirmed"),c=new f.PublicKey(e.publicKey.toBase58()),a=new f.PublicKey(t.asset);try{let p=(await n.getAccountInfo(a,"confirmed"))?.owner.toBase58()===u.TOKEN_2022_PROGRAM_ID.toBase58()?u.TOKEN_2022_PROGRAM_ID:u.TOKEN_PROGRAM_ID,d=await(0,u.getAssociatedTokenAddress)(a,c,!1,p),S=await(0,u.getAccount)(n,d,void 0,p),l=t.extra?.decimals??6;return Number(S.amount)/Math.pow(10,l)}catch(i){if(i&&typeof i=="object"&&"name"in i&&(i.name==="TokenAccountNotFoundError"||i.name==="TokenInvalidAccountOwnerError"))return 0;throw i}}async buildTransaction(t,e,o){if(!j(e))throw new Error("Invalid Solana wallet");if(!e.publicKey)throw new Error("Wallet not connected");let s=o||this.getDefaultRpcUrl(t.network),n=new f.Connection(s,"confirmed"),c=new f.PublicKey(e.publicKey.toBase58()),{payTo:a,asset:i,extra:p}=t,d=t.amount??t.maxAmountRequired;if(!d)throw new Error("Missing amount in payment requirements");if(!p?.feePayer)throw new Error("Missing feePayer in payment requirements");let S=new f.PublicKey(p.feePayer),l=new f.PublicKey(i),g=new f.PublicKey(a);this.log("Building transaction:",{from:c.toBase58(),to:a,amount:d,asset:i,feePayer:p.feePayer});let A=[];A.push(f.ComputeBudgetProgram.setComputeUnitLimit({units:Rt})),A.push(f.ComputeBudgetProgram.setComputeUnitPrice({microLamports:vt}));let y=await n.getAccountInfo(l,"confirmed");if(!y)throw new Error(`Token mint ${i} not found`);let E=y.owner.toBase58()===u.TOKEN_2022_PROGRAM_ID.toBase58()?u.TOKEN_2022_PROGRAM_ID:u.TOKEN_PROGRAM_ID,w=await(0,u.getMint)(n,l,void 0,E);typeof p?.decimals=="number"&&w.decimals!==p.decimals&&this.log(`Decimals mismatch: requirements say ${p.decimals}, mint says ${w.decimals}`);let T=await(0,u.getAssociatedTokenAddress)(l,c,!1,E),h=await(0,u.getAssociatedTokenAddress)(l,g,!1,E);if(!await n.getAccountInfo(T,"confirmed"))throw new Error(`No token account found for ${i}. Please ensure you have USDC in your wallet.`);if(!await n.getAccountInfo(h,"confirmed"))throw new Error(`Seller token account not found. The seller (${a}) must have a USDC account.`);let $=BigInt(d);A.push((0,u.createTransferCheckedInstruction)(T,l,h,c,$,w.decimals,[],E));let{blockhash:R}=await n.getLatestBlockhash("confirmed"),H=new f.TransactionMessage({payerKey:S,recentBlockhash:R,instructions:A}).compileToV0Message(),_=new f.VersionedTransaction(H),v=await e.signTransaction(_);return this.log("Transaction signed successfully"),{serialized:Buffer.from(v.serialize()).toString("base64")}}};function ft(r){return new z(r)}var Bt={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},yt=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function q(r){if(!r||typeof r!="object")return!1;let t=r;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var Z=class{name="EVM";networks=[k,x,X,F,O,M,L,U,W,K];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t==="polygon"||t==="optimism"||t==="avalanche"||t==="skale-base"||t==="skale-base-sepolia"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:m[t]?m[t]:t==="base"?m[x]:t==="bsc"?m[k]:t==="ethereum"?m[F]:t==="arbitrum"?m[O]:t==="polygon"?m[M]:t==="optimism"?m[L]:t==="avalanche"?m[U]:t==="skale-base"?m[W]:t==="skale-base-sepolia"?m[K]:m[x]}getAddress(t){return q(t)?t.address:null}isConnected(t){return q(t)?!!t.address:!1}getChainId(t){if(mt[t])return mt[t];if(t.startsWith("eip155:")){let e=t.split(":")[1];return parseInt(e,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:8453}async getBalance(t,e,o){if(!q(e)||!e.address)return 0;let s=o||this.getDefaultRpcUrl(t.network);try{let n=this.encodeBalanceOf(e.address),c=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.asset,data:n},"latest"]})});if(!c.ok)throw new Error(`RPC request failed: ${c.status}`);let a=await c.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")return 0;let i=BigInt(a.result),p=t.extra?.decimals??6;return Number(i)/Math.pow(10,p)}catch(n){throw n}}encodeBalanceOf(t){let e="0x70a08231",o=t.slice(2).toLowerCase().padStart(64,"0");return e+o}async buildTransaction(t,e,o){if(!q(e))throw new Error("Invalid EVM wallet");if(!e.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,e,o);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,e,o);let{payTo:s,asset:n,extra:c}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:e.address,to:s,amount:a,asset:n,network:t.network});let i=this.getChainId(t.network),p={name:c?.name??"USD Coin",version:c?.version??"2",chainId:BigInt(i),verifyingContract:n},d={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},S=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(S);let l="0x"+[...S].map(T=>T.toString(16).padStart(2,"0")).join(""),g=Math.floor(Date.now()/1e3),A={from:e.address,to:s,value:a,validAfter:String(g-600),validBefore:String(g+(t.maxTimeoutSeconds||60)),nonce:l},y={from:e.address,to:s,value:BigInt(a),validAfter:BigInt(g-600),validBefore:BigInt(g+(t.maxTimeoutSeconds||60)),nonce:l};if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let E=await e.signTypedData({domain:p,types:d,primaryType:"TransferWithAuthorization",message:y});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:A,signature:E}),signature:E}}async buildApprovalTransaction(t,e,o){let{payTo:s,asset:n,extra:c}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");let i=c?.facilitatorContract;if(!i)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:e.address,to:s,amount:a,asset:n,network:t.network,facilitatorContract:i});let p=o||this.getDefaultRpcUrl(t.network),d=c?.fee??"0",S=BigInt(a)+BigInt(d),l=await this.readAllowance(p,n,e.address,i);if(l<S){if(!e.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let _=this.calculateApprovalAmount(a,d,c?.approvalStrategy);this.log(`Approving ${_} for ${i} (current allowance: ${l})`);let v=await e.sendTransaction({to:n,data:this.encodeApprove(i,_),value:0n});this.log(`Approval tx sent: ${v}`),await this.waitForReceipt(p,v),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let g=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(g);let A=[...g].reduce((_,v)=>_*256n+BigInt(v),0n).toString(),y=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(y);let E="0x"+[...y].map(_=>_.toString(16).padStart(2,"0")).join(""),T=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),h=c?.eip712Domain,b=h?{name:h.name,version:h.version,chainId:BigInt(h.chainId),verifyingContract:h.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:i},I=c?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},$={from:e.address,to:s,token:n,amount:BigInt(a),fee:BigInt(d),nonce:BigInt(A),deadline:BigInt(T),paymentId:E},R=await e.signTypedData({domain:b,types:I,primaryType:"Payment",message:$});this.log("EIP-712 Payment signature obtained");let H={from:e.address,to:s,token:n,amount:a,fee:d,nonce:A,deadline:T,paymentId:E,signature:R};return{serialized:JSON.stringify(H),signature:R}}async buildPermit2Transaction(t,e,o){let{payTo:s,asset:n}=t,c=t.amount??t.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:e.address,to:s,amount:c,asset:n,network:t.network});let a=o||this.getDefaultRpcUrl(t.network),i=await this.readAllowance(a,n,e.address,C),p;if(i<BigInt(c)){let b=this.encodeApprove(C,yt);if(e.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${i})`);let I=this.getChainId(t.network),$=await this.readGasPrice(a),R=await this.readNonce(a,e.address),H=await e.signTransaction({to:n,data:b,chainId:I,gas:50000n,gasPrice:$,nonce:R});p={erc20ApprovalGasSponsoring:{info:{from:e.address,asset:n,spender:C,amount:yt.toString(),signedTransaction:H,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(e.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${i})`);let I=await e.sendTransaction({to:n,data:b,value:0n});this.log(`Permit2 approval tx sent: ${I}`),await this.waitForReceipt(a,I),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let S=[...d].reduce((b,I)=>b*256n+BigInt(I),0n),l=Math.floor(Date.now()/1e3),g=l-600,A=l+(t.maxTimeoutSeconds||300),y=this.getChainId(t.network),E={name:"Permit2",chainId:BigInt(y),verifyingContract:C},w={permitted:{token:n,amount:BigInt(c)},spender:V,nonce:S,deadline:BigInt(A),witness:{to:s,validAfter:BigInt(g)}},T=await e.signTypedData({domain:E,types:Bt,primaryType:"PermitWitnessTransferFrom",message:w});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let h={signature:T,permit2Authorization:{from:e.address,permitted:{token:n,amount:c},spender:V,nonce:S.toString(),deadline:String(A),witness:{to:s,validAfter:String(g)}}};return{serialized:JSON.stringify(h),signature:T,extensions:p}}async readAllowance(t,e,o,s){let n="0xdd62ed3e",c=o.slice(2).toLowerCase().padStart(64,"0"),a=s.slice(2).toLowerCase().padStart(64,"0"),i=n+c+a;try{let d=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e,data:i},"latest"]})})).json();return d.error||!d.result||d.result==="0x"?0n:BigInt(d.result)}catch{return 0n}}encodeApprove(t,e){let o="0x095ea7b3",s=t.slice(2).toLowerCase().padStart(64,"0"),n=e.toString(16).padStart(64,"0");return o+s+n}async waitForReceipt(t,e,o=3e4){let s=Date.now();for(;Date.now()-s<o;){try{let c=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[e]})})).json();if(c.result){if(c.result.status==="0x0")throw new Error(`Approval transaction reverted: ${e}`);return}}catch(n){if(n instanceof Error&&n.message.includes("reverted"))throw n}await new Promise(n=>setTimeout(n,2e3))}throw new Error(`Approval transaction receipt timeout after ${o}ms: ${e}`)}async readGasPrice(t){try{let o=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return o.result?BigInt(o.result):50000000n}catch{return 50000000n}}async readNonce(t,e){try{let s=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[e,"latest"]})})).json();return s.result?parseInt(s.result,16):0}catch{return 0}}calculateApprovalAmount(t,e,o){let s=BigInt(t)+BigInt(e);if(!o||o.mode==="exact")return s;let n=BigInt(o.defaultMultiple??10),c=s*n;if(o.maxCapUsd){let a=this.inferDecimals(t),i=BigInt(Math.floor(o.maxCapUsd*Math.pow(10,a)));if(c>i)return i}if(o.exactAboveUsd){let a=this.inferDecimals(t),i=BigInt(Math.floor(o.exactAboveUsd*Math.pow(10,a)));if(BigInt(t)>i)return s}return c}inferDecimals(t){return t.length>12?18:6}};function lt(r){return new Z(r)}function Dt(r){if(r===Tt||r===ht)return!0;let t=r.toLowerCase();for(let e of Object.values(Y))if(e.toLowerCase()===t)return!0;for(let e of Object.keys(J))if(e.toLowerCase()===t)return!0;return!1}function Ot(r=!1){return[ft({verbose:r}),lt({verbose:r})]}function Mt(r,t){return r.find(e=>e.canHandle(t))}0&&(module.exports={ARBITRUM_ONE,AVALANCHE,BASE_MAINNET,BASE_SEPOLIA,BSC_MAINNET,BSC_STABLECOIN_ADDRESSES,BSC_USDC,BSC_USDT,ETHEREUM_MAINNET,EvmAdapter,OPTIMISM,PERMIT2_ADDRESS,POLYGON,SKALE_BASE,SKALE_BASE_SEPOLIA,SOLANA_DEVNET,SOLANA_MAINNET,SOLANA_TESTNET,SolanaAdapter,USDC_ADDRESSES,X402_EXACT_PERMIT2_PROXY,createDefaultAdapters,createEvmAdapter,createSolanaAdapter,findAdapter,isEvmWallet,isKnownUSDC,isSolanaWallet});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
3
|
-
|
|
1
|
+
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-i7C2GiVY.cjs';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-i7C2GiVY.cjs';
|
|
3
|
+
export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.cjs';
|
|
4
|
+
import '../types-CKiTYeJ-.cjs';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Check if an asset address is a known USDC contract (any chain).
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
3
|
-
|
|
1
|
+
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-BPKUVJEl.js';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-BPKUVJEl.js';
|
|
3
|
+
export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.js';
|
|
4
|
+
import '../types-CKiTYeJ-.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Check if an asset address is a known USDC contract (any chain).
|
package/dist/adapters/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PublicKey as P,Connection as nt,TransactionMessage as ct,VersionedTransaction as dt,ComputeBudgetProgram as rt}from"@solana/web3.js";import{getAssociatedTokenAddress as H,getAccount as pt,createTransferCheckedInstruction as ut,getMint as ft,TOKEN_PROGRAM_ID as ot,TOKEN_2022_PROGRAM_ID as W}from"@solana/spl-token";var U="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",F="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",j="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",x={[U]:"https://api.dexter.cash/api/solana/rpc",[F]:"https://api.devnet.solana.com",[j]:"https://api.testnet.solana.com"},lt=12e3,mt=1;function k(c){if(!c||typeof c!="object")return!1;let t=c;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var K=class{name="Solana";networks=[U,F,j];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:x[t]?x[t]:t==="solana"?x[U]:t==="solana-devnet"?x[F]:t==="solana-testnet"?x[j]:x[U]}getAddress(t){return k(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return k(t)?t.publicKey!==null:!1}async getBalance(t,e,a){if(!k(e)||!e.publicKey)return 0;let i=a||this.getDefaultRpcUrl(t.network),n=new nt(i,"confirmed"),s=new P(e.publicKey.toBase58()),r=new P(t.asset);try{let d=(await n.getAccountInfo(r,"confirmed"))?.owner.toBase58()===W.toBase58()?W:ot,p=await H(r,s,!1,d),g=await pt(n,p,void 0,d),u=t.extra?.decimals??6;return Number(g.amount)/Math.pow(10,u)}catch(o){if(o&&typeof o=="object"&&"name"in o&&(o.name==="TokenAccountNotFoundError"||o.name==="TokenInvalidAccountOwnerError"))return 0;throw o}}async buildTransaction(t,e,a){if(!k(e))throw new Error("Invalid Solana wallet");if(!e.publicKey)throw new Error("Wallet not connected");let i=a||this.getDefaultRpcUrl(t.network),n=new nt(i,"confirmed"),s=new P(e.publicKey.toBase58()),{payTo:r,asset:o,extra:d}=t,p=t.amount??t.maxAmountRequired;if(!p)throw new Error("Missing amount in payment requirements");if(!d?.feePayer)throw new Error("Missing feePayer in payment requirements");let g=new P(d.feePayer),u=new P(o),f=new P(r);this.log("Building transaction:",{from:s.toBase58(),to:r,amount:p,asset:o,feePayer:d.feePayer});let l=[];l.push(rt.setComputeUnitLimit({units:lt})),l.push(rt.setComputeUnitPrice({microLamports:mt}));let A=await n.getAccountInfo(u,"confirmed");if(!A)throw new Error(`Token mint ${o} not found`);let m=A.owner.toBase58()===W.toBase58()?W:ot,T=await ft(n,u,void 0,m);typeof d?.decimals=="number"&&T.decimals!==d.decimals&&this.log(`Decimals mismatch: requirements say ${d.decimals}, mint says ${T.decimals}`);let h=await H(u,s,!1,m),y=await H(u,f,!1,m);if(!await n.getAccountInfo(h,"confirmed"))throw new Error(`No token account found for ${o}. Please ensure you have USDC in your wallet.`);if(!await n.getAccountInfo(y,"confirmed"))throw new Error(`Seller token account not found. The seller (${r}) must have a USDC account.`);let _=BigInt(p);l.push(ut(h,u,y,s,_,T.decimals,[],m));let{blockhash:I}=await n.getLatestBlockhash("confirmed"),N=new ct({payerKey:g,recentBlockhash:I,instructions:l}).compileToV0Message(),E=new dt(N),C=await e.signTransaction(E);return this.log("Transaction signed successfully"),{serialized:Buffer.from(C.serialize()).toString("base64")}}};function X(c){return new K(c)}var M="0x000000000022D473030F116dDEE9F6B43aC78BA3",Y="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",gt={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},at=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),v="eip155:8453",L="eip155:84532",B="eip155:42161",$="eip155:137",V="eip155:10",J="eip155:43114",D="eip155:56",z="eip155:1187947933",G="eip155:324705682",R="eip155:1",it="0x55d398326f99059fF775485246999027B3197955",Z="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",st={[D]:56,[v]:8453,[L]:84532,[B]:42161,[$]:137,[V]:10,[J]:43114,[z]:1187947933,[G]:324705682,[R]:1},b={[D]:"https://bsc-dataseed1.binance.org",[v]:"https://api.dexter.cash/api/base/rpc",[L]:"https://sepolia.base.org",[B]:"https://arb1.arbitrum.io/rpc",[$]:"https://polygon-rpc.com",[V]:"https://mainnet.optimism.io",[J]:"https://api.avax.network/ext/bc/C/rpc",[z]:"https://skale-base.skalenodes.com/v1/base",[G]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[R]:"https://eth.llamarpc.com"},Q={[D]:Z,[v]:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",[L]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[B]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[$]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[V]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[J]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[z]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[G]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[R]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},tt={[it]:{symbol:"USDT",decimals:18},[Z]:{symbol:"USDC",decimals:18}};function O(c){if(!c||typeof c!="object")return!1;let t=c;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var q=class{name="EVM";networks=[D,v,L,R,B];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:b[t]?b[t]:t==="base"?b[v]:t==="bsc"?b[D]:t==="ethereum"?b[R]:t==="arbitrum"?b[B]:b[v]}getAddress(t){return O(t)?t.address:null}isConnected(t){return O(t)?!!t.address:!1}getChainId(t){if(st[t])return st[t];if(t.startsWith("eip155:")){let e=t.split(":")[1];return parseInt(e,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:8453}async getBalance(t,e,a){if(!O(e)||!e.address)return 0;let i=a||this.getDefaultRpcUrl(t.network);try{let n=this.encodeBalanceOf(e.address),s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.asset,data:n},"latest"]})});if(!s.ok)throw new Error(`RPC request failed: ${s.status}`);let r=await s.json();if(r.error)throw new Error(`RPC error: ${JSON.stringify(r.error)}`);if(!r.result||r.result==="0x")return 0;let o=BigInt(r.result),d=t.extra?.decimals??6;return Number(o)/Math.pow(10,d)}catch(n){throw n}}encodeBalanceOf(t){let e="0x70a08231",a=t.slice(2).toLowerCase().padStart(64,"0");return e+a}async buildTransaction(t,e,a){if(!O(e))throw new Error("Invalid EVM wallet");if(!e.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,e,a);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,e,a);let{payTo:i,asset:n,extra:s}=t,r=t.amount??t.maxAmountRequired;if(!r)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:e.address,to:i,amount:r,asset:n,network:t.network});let o=this.getChainId(t.network),d={name:s?.name??"USD Coin",version:s?.version??"2",chainId:BigInt(o),verifyingContract:n},p={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},g=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(g);let u="0x"+[...g].map(h=>h.toString(16).padStart(2,"0")).join(""),f=Math.floor(Date.now()/1e3),l={from:e.address,to:i,value:r,validAfter:String(f-600),validBefore:String(f+(t.maxTimeoutSeconds||60)),nonce:u},A={from:e.address,to:i,value:BigInt(r),validAfter:BigInt(f-600),validBefore:BigInt(f+(t.maxTimeoutSeconds||60)),nonce:u};if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let m=await e.signTypedData({domain:d,types:p,primaryType:"TransferWithAuthorization",message:A});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:l,signature:m}),signature:m}}async buildApprovalTransaction(t,e,a){let{payTo:i,asset:n,extra:s}=t,r=t.amount??t.maxAmountRequired;if(!r)throw new Error("Missing amount in payment requirements");let o=s?.facilitatorContract;if(!o)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:e.address,to:i,amount:r,asset:n,network:t.network,facilitatorContract:o});let d=a||this.getDefaultRpcUrl(t.network),p=s?.fee??"0",g=BigInt(r)+BigInt(p),u=await this.readAllowance(d,n,e.address,o);if(u<g){if(!e.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let E=this.calculateApprovalAmount(r,p,s?.approvalStrategy);this.log(`Approving ${E} for ${o} (current allowance: ${u})`);let C=await e.sendTransaction({to:n,data:this.encodeApprove(o,E),value:0n});this.log(`Approval tx sent: ${C}`),await this.waitForReceipt(d,C),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let f=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(f);let l=[...f].reduce((E,C)=>E*256n+BigInt(C),0n).toString(),A=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(A);let m="0x"+[...A].map(E=>E.toString(16).padStart(2,"0")).join(""),h=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),y=s?.eip712Domain,w=y?{name:y.name,version:y.version,chainId:BigInt(y.chainId),verifyingContract:y.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:o},S=s?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},_={from:e.address,to:i,token:n,amount:BigInt(r),fee:BigInt(p),nonce:BigInt(l),deadline:BigInt(h),paymentId:m},I=await e.signTypedData({domain:w,types:S,primaryType:"Payment",message:_});this.log("EIP-712 Payment signature obtained");let N={from:e.address,to:i,token:n,amount:r,fee:p,nonce:l,deadline:h,paymentId:m,signature:I};return{serialized:JSON.stringify(N),signature:I}}async buildPermit2Transaction(t,e,a){let{payTo:i,asset:n}=t,s=t.amount??t.maxAmountRequired;if(!s)throw new Error("Missing amount in payment requirements");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:e.address,to:i,amount:s,asset:n,network:t.network});let r=a||this.getDefaultRpcUrl(t.network),o=await this.readAllowance(r,n,e.address,M),d;if(o<BigInt(s)){let w=this.encodeApprove(M,at);if(e.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${o})`);let S=this.getChainId(t.network),_=await this.readGasPrice(r),I=await this.readNonce(r,e.address),N=await e.signTransaction({to:n,data:w,chainId:S,gas:50000n,gasPrice:_,nonce:I});d={erc20ApprovalGasSponsoring:{info:{from:e.address,asset:n,spender:M,amount:at.toString(),signedTransaction:N,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(e.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${o})`);let S=await e.sendTransaction({to:n,data:w,value:0n});this.log(`Permit2 approval tx sent: ${S}`),await this.waitForReceipt(r,S),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let g=[...p].reduce((w,S)=>w*256n+BigInt(S),0n),u=Math.floor(Date.now()/1e3),f=u-600,l=u+(t.maxTimeoutSeconds||300),A=this.getChainId(t.network),m={name:"Permit2",chainId:BigInt(A),verifyingContract:M},T={permitted:{token:n,amount:BigInt(s)},spender:Y,nonce:g,deadline:BigInt(l),witness:{to:i,validAfter:BigInt(f)}},h=await e.signTypedData({domain:m,types:gt,primaryType:"PermitWitnessTransferFrom",message:T});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let y={signature:h,permit2Authorization:{from:e.address,permitted:{token:n,amount:s},spender:Y,nonce:g.toString(),deadline:String(l),witness:{to:i,validAfter:String(f)}}};return{serialized:JSON.stringify(y),signature:h,extensions:d}}async readAllowance(t,e,a,i){let n="0xdd62ed3e",s=a.slice(2).toLowerCase().padStart(64,"0"),r=i.slice(2).toLowerCase().padStart(64,"0"),o=n+s+r;try{let p=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e,data:o},"latest"]})})).json();return p.error||!p.result||p.result==="0x"?0n:BigInt(p.result)}catch{return 0n}}encodeApprove(t,e){let a="0x095ea7b3",i=t.slice(2).toLowerCase().padStart(64,"0"),n=e.toString(16).padStart(64,"0");return a+i+n}async waitForReceipt(t,e,a=3e4){let i=Date.now();for(;Date.now()-i<a;){try{let s=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[e]})})).json();if(s.result){if(s.result.status==="0x0")throw new Error(`Approval transaction reverted: ${e}`);return}}catch(n){if(n instanceof Error&&n.message.includes("reverted"))throw n}await new Promise(n=>setTimeout(n,2e3))}throw new Error(`Approval transaction receipt timeout after ${a}ms: ${e}`)}async readGasPrice(t){try{let a=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return a.result?BigInt(a.result):50000000n}catch{return 50000000n}}async readNonce(t,e){try{let i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[e,"latest"]})})).json();return i.result?parseInt(i.result,16):0}catch{return 0}}calculateApprovalAmount(t,e,a){let i=BigInt(t)+BigInt(e);if(!a||a.mode==="exact")return i;let n=BigInt(a.defaultMultiple??10),s=i*n;if(a.maxCapUsd){let r=this.inferDecimals(t),o=BigInt(Math.floor(a.maxCapUsd*Math.pow(10,r)));if(s>o)return o}if(a.exactAboveUsd){let r=this.inferDecimals(t),o=BigInt(Math.floor(a.exactAboveUsd*Math.pow(10,r)));if(BigInt(t)>o)return i}return s}inferDecimals(t){return t.length>12?18:6}};function et(c){return new q(c)}function bt(c){if(c==="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"||c==="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU")return!0;let t=c.toLowerCase();for(let e of Object.values(Q))if(e.toLowerCase()===t)return!0;for(let e of Object.keys(tt))if(e.toLowerCase()===t)return!0;return!1}function vt(c=!1){return[X({verbose:c}),et({verbose:c})]}function It(c,t){return c.find(e=>e.canHandle(t))}export{B as ARBITRUM_ONE,J as AVALANCHE,v as BASE_MAINNET,L as BASE_SEPOLIA,D as BSC_MAINNET,tt as BSC_STABLECOIN_ADDRESSES,Z as BSC_USDC,it as BSC_USDT,R as ETHEREUM_MAINNET,q as EvmAdapter,V as OPTIMISM,M as PERMIT2_ADDRESS,$ as POLYGON,z as SKALE_BASE,G as SKALE_BASE_SEPOLIA,F as SOLANA_DEVNET,U as SOLANA_MAINNET,j as SOLANA_TESTNET,K as SolanaAdapter,Q as USDC_ADDRESSES,Y as X402_EXACT_PERMIT2_PROXY,vt as createDefaultAdapters,et as createEvmAdapter,X as createSolanaAdapter,It as findAdapter,O as isEvmWallet,bt as isKnownUSDC,k as isSolanaWallet};
|
|
1
|
+
import{PublicKey as R,Connection as Tt,TransactionMessage as Ct,VersionedTransaction as wt,ComputeBudgetProgram as ht}from"@solana/web3.js";import{getAssociatedTokenAddress as ut,getAccount as bt,createTransferCheckedInstruction as Nt,getMint as xt,TOKEN_PROGRAM_ID as yt,TOKEN_2022_PROGRAM_ID as at}from"@solana/spl-token";var mt="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",gt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",At="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",x=mt,D=gt,O=At,H="eip155:8453",X="eip155:84532",G="eip155:42161",Y="eip155:137",J="eip155:10",z="eip155:43114",Z="eip155:56",Q="eip155:1187947933",tt="eip155:324705682",et="eip155:1",P=H,nt=X,M=G,L=Y,U=J,k=z,W=Z,K=Q,F=tt,V=et,Et="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",St="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",_t="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",pt="0x55d398326f99059fF775485246999027B3197955",rt="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",ot={[Z]:rt,[H]:_t,[X]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[G]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[Y]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[J]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[z]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[Q]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[tt]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[et]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},st={[pt]:{symbol:"USDT",decimals:18},[rt]:{symbol:"USDC",decimals:18}};var C="0x000000000022D473030F116dDEE9F6B43aC78BA3",j="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",dt={[Z]:56,[H]:8453,[X]:84532,[G]:42161,[Y]:137,[J]:10,[z]:43114,[Q]:1187947933,[tt]:324705682,[et]:1},w={[mt]:"https://api.dexter.cash/api/solana/rpc",[gt]:"https://api.devnet.solana.com",[At]:"https://api.testnet.solana.com"},f={[Z]:"https://bsc-dataseed1.binance.org",[H]:"https://api.dexter.cash/api/base/rpc",[X]:"https://sepolia.base.org",[G]:"https://arb1.arbitrum.io/rpc",[Y]:"https://polygon-rpc.com",[J]:"https://mainnet.optimism.io",[z]:"https://api.avax.network/ext/bc/C/rpc",[Q]:"https://skale-base.skalenodes.com/v1/base",[tt]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[et]:"https://eth.llamarpc.com"};var Pt=12e3,Rt=1;function q(c){if(!c||typeof c!="object")return!1;let t=c;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var it=class{name="Solana";networks=[x,D,O];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:w[t]?w[t]:t==="solana"?w[x]:t==="solana-devnet"?w[D]:t==="solana-testnet"?w[O]:w[x]}getAddress(t){return q(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return q(t)?t.publicKey!==null:!1}async getBalance(t,e,s){if(!q(e)||!e.publicKey)return 0;let i=s||this.getDefaultRpcUrl(t.network),n=new Tt(i,"confirmed"),a=new R(e.publicKey.toBase58()),r=new R(t.asset);try{let p=(await n.getAccountInfo(r,"confirmed"))?.owner.toBase58()===at.toBase58()?at:yt,d=await ut(r,a,!1,p),A=await bt(n,d,void 0,p),u=t.extra?.decimals??6;return Number(A.amount)/Math.pow(10,u)}catch(o){if(o&&typeof o=="object"&&"name"in o&&(o.name==="TokenAccountNotFoundError"||o.name==="TokenInvalidAccountOwnerError"))return 0;throw o}}async buildTransaction(t,e,s){if(!q(e))throw new Error("Invalid Solana wallet");if(!e.publicKey)throw new Error("Wallet not connected");let i=s||this.getDefaultRpcUrl(t.network),n=new Tt(i,"confirmed"),a=new R(e.publicKey.toBase58()),{payTo:r,asset:o,extra:p}=t,d=t.amount??t.maxAmountRequired;if(!d)throw new Error("Missing amount in payment requirements");if(!p?.feePayer)throw new Error("Missing feePayer in payment requirements");let A=new R(p.feePayer),u=new R(o),l=new R(r);this.log("Building transaction:",{from:a.toBase58(),to:r,amount:d,asset:o,feePayer:p.feePayer});let m=[];m.push(ht.setComputeUnitLimit({units:Pt})),m.push(ht.setComputeUnitPrice({microLamports:Rt}));let T=await n.getAccountInfo(u,"confirmed");if(!T)throw new Error(`Token mint ${o} not found`);let g=T.owner.toBase58()===at.toBase58()?at:yt,I=await xt(n,u,void 0,g);typeof p?.decimals=="number"&&I.decimals!==p.decimals&&this.log(`Decimals mismatch: requirements say ${p.decimals}, mint says ${I.decimals}`);let E=await ut(u,a,!1,g),S=await ut(u,l,!1,g);if(!await n.getAccountInfo(E,"confirmed"))throw new Error(`No token account found for ${o}. Please ensure you have USDC in your wallet.`);if(!await n.getAccountInfo(S,"confirmed"))throw new Error(`Seller token account not found. The seller (${r}) must have a USDC account.`);let v=BigInt(d);m.push(Nt(E,u,S,a,v,I.decimals,[],g));let{blockhash:b}=await n.getLatestBlockhash("confirmed"),B=new Ct({payerKey:A,recentBlockhash:b,instructions:m}).compileToV0Message(),y=new wt(B),N=await e.signTransaction(y);return this.log("Transaction signed successfully"),{serialized:Buffer.from(N.serialize()).toString("base64")}}};function ft(c){return new it(c)}var vt={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},It=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function $(c){if(!c||typeof c!="object")return!1;let t=c;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var ct=class{name="EVM";networks=[W,P,nt,V,M,L,U,k,K,F];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t==="polygon"||t==="optimism"||t==="avalanche"||t==="skale-base"||t==="skale-base-sepolia"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:f[t]?f[t]:t==="base"?f[P]:t==="bsc"?f[W]:t==="ethereum"?f[V]:t==="arbitrum"?f[M]:t==="polygon"?f[L]:t==="optimism"?f[U]:t==="avalanche"?f[k]:t==="skale-base"?f[K]:t==="skale-base-sepolia"?f[F]:f[P]}getAddress(t){return $(t)?t.address:null}isConnected(t){return $(t)?!!t.address:!1}getChainId(t){if(dt[t])return dt[t];if(t.startsWith("eip155:")){let e=t.split(":")[1];return parseInt(e,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:8453}async getBalance(t,e,s){if(!$(e)||!e.address)return 0;let i=s||this.getDefaultRpcUrl(t.network);try{let n=this.encodeBalanceOf(e.address),a=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.asset,data:n},"latest"]})});if(!a.ok)throw new Error(`RPC request failed: ${a.status}`);let r=await a.json();if(r.error)throw new Error(`RPC error: ${JSON.stringify(r.error)}`);if(!r.result||r.result==="0x")return 0;let o=BigInt(r.result),p=t.extra?.decimals??6;return Number(o)/Math.pow(10,p)}catch(n){throw n}}encodeBalanceOf(t){let e="0x70a08231",s=t.slice(2).toLowerCase().padStart(64,"0");return e+s}async buildTransaction(t,e,s){if(!$(e))throw new Error("Invalid EVM wallet");if(!e.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,e,s);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,e,s);let{payTo:i,asset:n,extra:a}=t,r=t.amount??t.maxAmountRequired;if(!r)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:e.address,to:i,amount:r,asset:n,network:t.network});let o=this.getChainId(t.network),p={name:a?.name??"USD Coin",version:a?.version??"2",chainId:BigInt(o),verifyingContract:n},d={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},A=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(A);let u="0x"+[...A].map(E=>E.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),m={from:e.address,to:i,value:r,validAfter:String(l-600),validBefore:String(l+(t.maxTimeoutSeconds||60)),nonce:u},T={from:e.address,to:i,value:BigInt(r),validAfter:BigInt(l-600),validBefore:BigInt(l+(t.maxTimeoutSeconds||60)),nonce:u};if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let g=await e.signTypedData({domain:p,types:d,primaryType:"TransferWithAuthorization",message:T});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:m,signature:g}),signature:g}}async buildApprovalTransaction(t,e,s){let{payTo:i,asset:n,extra:a}=t,r=t.amount??t.maxAmountRequired;if(!r)throw new Error("Missing amount in payment requirements");let o=a?.facilitatorContract;if(!o)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:e.address,to:i,amount:r,asset:n,network:t.network,facilitatorContract:o});let p=s||this.getDefaultRpcUrl(t.network),d=a?.fee??"0",A=BigInt(r)+BigInt(d),u=await this.readAllowance(p,n,e.address,o);if(u<A){if(!e.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let y=this.calculateApprovalAmount(r,d,a?.approvalStrategy);this.log(`Approving ${y} for ${o} (current allowance: ${u})`);let N=await e.sendTransaction({to:n,data:this.encodeApprove(o,y),value:0n});this.log(`Approval tx sent: ${N}`),await this.waitForReceipt(p,N),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let l=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(l);let m=[...l].reduce((y,N)=>y*256n+BigInt(N),0n).toString(),T=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(T);let g="0x"+[...T].map(y=>y.toString(16).padStart(2,"0")).join(""),E=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),S=a?.eip712Domain,_=S?{name:S.name,version:S.version,chainId:BigInt(S.chainId),verifyingContract:S.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:o},h=a?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},v={from:e.address,to:i,token:n,amount:BigInt(r),fee:BigInt(d),nonce:BigInt(m),deadline:BigInt(E),paymentId:g},b=await e.signTypedData({domain:_,types:h,primaryType:"Payment",message:v});this.log("EIP-712 Payment signature obtained");let B={from:e.address,to:i,token:n,amount:r,fee:d,nonce:m,deadline:E,paymentId:g,signature:b};return{serialized:JSON.stringify(B),signature:b}}async buildPermit2Transaction(t,e,s){let{payTo:i,asset:n}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");if(!e.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:e.address,to:i,amount:a,asset:n,network:t.network});let r=s||this.getDefaultRpcUrl(t.network),o=await this.readAllowance(r,n,e.address,C),p;if(o<BigInt(a)){let _=this.encodeApprove(C,It);if(e.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${o})`);let h=this.getChainId(t.network),v=await this.readGasPrice(r),b=await this.readNonce(r,e.address),B=await e.signTransaction({to:n,data:_,chainId:h,gas:50000n,gasPrice:v,nonce:b});p={erc20ApprovalGasSponsoring:{info:{from:e.address,asset:n,spender:C,amount:It.toString(),signedTransaction:B,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(e.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${o})`);let h=await e.sendTransaction({to:n,data:_,value:0n});this.log(`Permit2 approval tx sent: ${h}`),await this.waitForReceipt(r,h),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let A=[...d].reduce((_,h)=>_*256n+BigInt(h),0n),u=Math.floor(Date.now()/1e3),l=u-600,m=u+(t.maxTimeoutSeconds||300),T=this.getChainId(t.network),g={name:"Permit2",chainId:BigInt(T),verifyingContract:C},I={permitted:{token:n,amount:BigInt(a)},spender:j,nonce:A,deadline:BigInt(m),witness:{to:i,validAfter:BigInt(l)}},E=await e.signTypedData({domain:g,types:vt,primaryType:"PermitWitnessTransferFrom",message:I});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let S={signature:E,permit2Authorization:{from:e.address,permitted:{token:n,amount:a},spender:j,nonce:A.toString(),deadline:String(m),witness:{to:i,validAfter:String(l)}}};return{serialized:JSON.stringify(S),signature:E,extensions:p}}async readAllowance(t,e,s,i){let n="0xdd62ed3e",a=s.slice(2).toLowerCase().padStart(64,"0"),r=i.slice(2).toLowerCase().padStart(64,"0"),o=n+a+r;try{let d=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e,data:o},"latest"]})})).json();return d.error||!d.result||d.result==="0x"?0n:BigInt(d.result)}catch{return 0n}}encodeApprove(t,e){let s="0x095ea7b3",i=t.slice(2).toLowerCase().padStart(64,"0"),n=e.toString(16).padStart(64,"0");return s+i+n}async waitForReceipt(t,e,s=3e4){let i=Date.now();for(;Date.now()-i<s;){try{let a=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[e]})})).json();if(a.result){if(a.result.status==="0x0")throw new Error(`Approval transaction reverted: ${e}`);return}}catch(n){if(n instanceof Error&&n.message.includes("reverted"))throw n}await new Promise(n=>setTimeout(n,2e3))}throw new Error(`Approval transaction receipt timeout after ${s}ms: ${e}`)}async readGasPrice(t){try{let s=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return s.result?BigInt(s.result):50000000n}catch{return 50000000n}}async readNonce(t,e){try{let i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[e,"latest"]})})).json();return i.result?parseInt(i.result,16):0}catch{return 0}}calculateApprovalAmount(t,e,s){let i=BigInt(t)+BigInt(e);if(!s||s.mode==="exact")return i;let n=BigInt(s.defaultMultiple??10),a=i*n;if(s.maxCapUsd){let r=this.inferDecimals(t),o=BigInt(Math.floor(s.maxCapUsd*Math.pow(10,r)));if(a>o)return o}if(s.exactAboveUsd){let r=this.inferDecimals(t),o=BigInt(Math.floor(s.exactAboveUsd*Math.pow(10,r)));if(BigInt(t)>o)return i}return a}inferDecimals(t){return t.length>12?18:6}};function lt(c){return new ct(c)}function qt(c){if(c===Et||c===St)return!0;let t=c.toLowerCase();for(let e of Object.values(ot))if(e.toLowerCase()===t)return!0;for(let e of Object.keys(st))if(e.toLowerCase()===t)return!0;return!1}function $t(c=!1){return[ft({verbose:c}),lt({verbose:c})]}function Ht(c,t){return c.find(e=>e.canHandle(t))}export{M as ARBITRUM_ONE,k as AVALANCHE,P as BASE_MAINNET,nt as BASE_SEPOLIA,W as BSC_MAINNET,st as BSC_STABLECOIN_ADDRESSES,rt as BSC_USDC,pt as BSC_USDT,V as ETHEREUM_MAINNET,ct as EvmAdapter,U as OPTIMISM,C as PERMIT2_ADDRESS,L as POLYGON,K as SKALE_BASE,F as SKALE_BASE_SEPOLIA,D as SOLANA_DEVNET,x as SOLANA_MAINNET,O as SOLANA_TESTNET,it as SolanaAdapter,ot as USDC_ADDRESSES,j as X402_EXACT_PERMIT2_PROXY,$t as createDefaultAdapters,lt as createEvmAdapter,ft as createSolanaAdapter,Ht as findAdapter,$ as isEvmWallet,qt as isKnownUSDC,q as isSolanaWallet};
|