agentcash 0.9.2 → 0.9.4

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.
Files changed (63) hide show
  1. package/dist/cjs/run-server.cjs +334 -317
  2. package/dist/esm/{chunk-G3AVBW3H.js → chunk-6RPXYBHW.js} +58 -26
  3. package/dist/esm/chunk-6RPXYBHW.js.map +1 -0
  4. package/dist/esm/{chunk-CGFED7FU.js → chunk-BZUAKI72.js} +2 -2
  5. package/dist/esm/chunk-EV4ASZA5.js +79 -0
  6. package/dist/esm/chunk-EV4ASZA5.js.map +1 -0
  7. package/dist/esm/{chunk-RAFN7MFS.js → chunk-G6QIDBTO.js} +22 -5
  8. package/dist/esm/chunk-G6QIDBTO.js.map +1 -0
  9. package/dist/esm/{chunk-PGMMXO5J.js → chunk-GQW673BP.js} +18 -18
  10. package/dist/esm/chunk-GQW673BP.js.map +1 -0
  11. package/dist/esm/{chunk-ST5ITYIM.js → chunk-HKNVLD7T.js} +12 -7
  12. package/dist/esm/chunk-HKNVLD7T.js.map +1 -0
  13. package/dist/esm/chunk-KKGRBCO7.js +7 -0
  14. package/dist/esm/{chunk-6FEDQ4HI.js → chunk-O3TDXKU6.js} +6 -3
  15. package/dist/esm/chunk-O3TDXKU6.js.map +1 -0
  16. package/dist/esm/{chunk-G5IKWSIV.js → chunk-TTRO2X7I.js} +2 -2
  17. package/dist/esm/{chunk-6ZASEAWN.js → chunk-VP4UJCTZ.js} +2 -2
  18. package/dist/esm/{chunk-CM6NIM6K.js → chunk-WTIOX2O6.js} +6 -2
  19. package/dist/esm/chunk-WTIOX2O6.js.map +1 -0
  20. package/dist/esm/{chunk-U2I7LBH4.js → chunk-ZQ2YF2PK.js} +6 -3
  21. package/dist/esm/{chunk-U2I7LBH4.js.map → chunk-ZQ2YF2PK.js.map} +1 -1
  22. package/dist/esm/{fetch-4X4N7TSG.js → fetch-374ILNGI.js} +7 -7
  23. package/dist/esm/{fetch-auth-R54NXQBZ.js → fetch-auth-KJU755M5.js} +4 -4
  24. package/dist/esm/{fund-WJNWLQWZ.js → fund-SSHNLEE3.js} +4 -4
  25. package/dist/esm/index.js +18 -18
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/{install-GB7Z3Y7Y.js → install-SX6MU34Z.js} +16 -10
  28. package/dist/esm/install-SX6MU34Z.js.map +1 -0
  29. package/dist/esm/{onboard-IOSC3DTG.js → onboard-QCEVIWQE.js} +19 -10
  30. package/dist/esm/onboard-QCEVIWQE.js.map +1 -0
  31. package/dist/esm/{report-error-CSI2EPQJ.js → report-error-FNQJ4Q5F.js} +3 -3
  32. package/dist/esm/{server-QT37RZYD.js → server-3CD3JI6I.js} +21 -19
  33. package/dist/esm/server-3CD3JI6I.js.map +1 -0
  34. package/dist/esm/{server-EM2KLQJY.js → server-D2PKZW5Y.js} +2 -2
  35. package/dist/esm/{settings-I7MPPOB7.js → settings-7MUKYBZ5.js} +6 -6
  36. package/dist/esm/{try-2XWGGAAP.js → try-NBARMW7Q.js} +5 -5
  37. package/dist/esm/{wallet-3ZWXDQNE.js → wallet-XOMKZAVH.js} +9 -12
  38. package/dist/esm/wallet-XOMKZAVH.js.map +1 -0
  39. package/package.json +5 -5
  40. package/dist/esm/chunk-6FEDQ4HI.js.map +0 -1
  41. package/dist/esm/chunk-CM6NIM6K.js.map +0 -1
  42. package/dist/esm/chunk-G3AVBW3H.js.map +0 -1
  43. package/dist/esm/chunk-GQTOWVH6.js +0 -7
  44. package/dist/esm/chunk-PGMMXO5J.js.map +0 -1
  45. package/dist/esm/chunk-RAFN7MFS.js.map +0 -1
  46. package/dist/esm/chunk-ST5ITYIM.js.map +0 -1
  47. package/dist/esm/chunk-UJO2BWV6.js +0 -112
  48. package/dist/esm/chunk-UJO2BWV6.js.map +0 -1
  49. package/dist/esm/install-GB7Z3Y7Y.js.map +0 -1
  50. package/dist/esm/onboard-IOSC3DTG.js.map +0 -1
  51. package/dist/esm/server-QT37RZYD.js.map +0 -1
  52. package/dist/esm/wallet-3ZWXDQNE.js.map +0 -1
  53. /package/dist/esm/{chunk-CGFED7FU.js.map → chunk-BZUAKI72.js.map} +0 -0
  54. /package/dist/esm/{chunk-GQTOWVH6.js.map → chunk-KKGRBCO7.js.map} +0 -0
  55. /package/dist/esm/{chunk-G5IKWSIV.js.map → chunk-TTRO2X7I.js.map} +0 -0
  56. /package/dist/esm/{chunk-6ZASEAWN.js.map → chunk-VP4UJCTZ.js.map} +0 -0
  57. /package/dist/esm/{fetch-4X4N7TSG.js.map → fetch-374ILNGI.js.map} +0 -0
  58. /package/dist/esm/{fetch-auth-R54NXQBZ.js.map → fetch-auth-KJU755M5.js.map} +0 -0
  59. /package/dist/esm/{fund-WJNWLQWZ.js.map → fund-SSHNLEE3.js.map} +0 -0
  60. /package/dist/esm/{report-error-CSI2EPQJ.js.map → report-error-FNQJ4Q5F.js.map} +0 -0
  61. /package/dist/esm/{server-EM2KLQJY.js.map → server-D2PKZW5Y.js.map} +0 -0
  62. /package/dist/esm/{settings-I7MPPOB7.js.map → settings-7MUKYBZ5.js.map} +0 -0
  63. /package/dist/esm/{try-2XWGGAAP.js.map → try-NBARMW7Q.js.map} +0 -0
@@ -1,53 +1,85 @@
1
+ // ../../internal/networks/src/configs.ts
2
+ import { base, tempo } from "viem/chains";
3
+
1
4
  // ../../internal/networks/src/types.ts
2
5
  var Network = /* @__PURE__ */ ((Network2) => {
3
- Network2["BASE"] = "eip155:8453";
4
- Network2["TEMPO"] = "eip155:4217";
5
- Network2["SOLANA"] = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
6
+ Network2["BASE"] = "base";
7
+ Network2["TEMPO"] = "tempo";
8
+ Network2["SOLANA"] = "solana";
6
9
  return Network2;
7
10
  })(Network || {});
8
11
 
9
- // ../../internal/networks/src/schemas.ts
10
- import z from "zod";
11
- import { isAddress } from "viem";
12
- import { isAddress as isSolanaAddress } from "@solana/kit";
13
- var networkSchema = z.enum(Network);
14
- var optionalNetworkSchema = networkSchema.optional();
15
- var evmNetworkSchema = networkSchema.refine((network) => network !== "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */, {
16
- message: "Invalid EVM chain"
17
- }).transform((network) => network);
18
- var ethereumAddressSchema = z.string().refine(isAddress, "Invalid EVM address");
19
- var solanaAddressSchema = z.string().refine(isSolanaAddress, "Invalid Solana address");
20
- var mixedAddressSchema = z.union([ethereumAddressSchema, solanaAddressSchema]).transform((address) => address);
21
-
22
12
  // ../../internal/networks/src/configs.ts
23
- import { base, tempo } from "viem/chains";
24
13
  var EVM_CONFIGS = {
25
- ["eip155:8453" /* BASE */]: {
14
+ ["base" /* BASE */]: {
26
15
  chain: base,
27
16
  name: "Base",
28
- caip2: "eip155:8453" /* BASE */,
17
+ caip2: "eip155:8453",
29
18
  usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
30
19
  },
31
- ["eip155:4217" /* TEMPO */]: {
20
+ ["tempo" /* TEMPO */]: {
32
21
  chain: tempo,
33
22
  name: "Tempo",
34
- caip2: "eip155:4217" /* TEMPO */,
23
+ caip2: "eip155:4217",
35
24
  usdcAddress: "0x20c0000000000000000000000000000000000000"
36
25
  }
37
26
  };
38
- var chainId = (network) => EVM_CONFIGS[network].chain.id;
39
27
  var SOLANA_CONFIG = {
40
28
  name: "Solana",
41
- caip2: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */,
29
+ caip2: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
42
30
  usdcAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
43
31
  };
32
+ var ALL_NETWORK_CONFIGS = {
33
+ ...EVM_CONFIGS,
34
+ ["solana" /* SOLANA */]: SOLANA_CONFIG
35
+ };
36
+ var networkToCaip2 = (network) => {
37
+ if (network === "solana" /* SOLANA */) {
38
+ return SOLANA_CONFIG.caip2;
39
+ }
40
+ return EVM_CONFIGS[network].caip2;
41
+ };
42
+ var TX_EXPLORER_URLS = {
43
+ ["base" /* BASE */]: "https://basescan.org/tx/",
44
+ ["tempo" /* TEMPO */]: "https://testnet.tempo.xyz/tx/",
45
+ ["solana" /* SOLANA */]: "https://solscan.io/tx/"
46
+ };
47
+ var getTxExplorerUrl = (txHash, network = "base" /* BASE */) => `${TX_EXPLORER_URLS[network]}${txHash}`;
48
+ var caip2ToNetwork = (caip2) => {
49
+ if (caip2 === SOLANA_CONFIG.caip2) {
50
+ return "solana" /* SOLANA */;
51
+ }
52
+ const evmNetwork = Object.entries(EVM_CONFIGS).find(
53
+ ([, config]) => config.caip2 === caip2
54
+ )?.[0];
55
+ if (evmNetwork) {
56
+ return evmNetwork;
57
+ }
58
+ return null;
59
+ };
60
+
61
+ // ../../internal/networks/src/schemas.ts
62
+ import z from "zod";
63
+ import { isAddress } from "viem";
64
+ import { isAddress as isSolanaAddress } from "@solana/kit";
65
+ var networkSchema = z.enum(Network);
66
+ var optionalNetworkSchema = networkSchema.optional();
67
+ var evmNetworkSchema = networkSchema.refine((network) => network !== "solana" /* SOLANA */, {
68
+ message: "Invalid EVM chain"
69
+ }).transform((network) => network);
70
+ var ethereumAddressSchema = z.string().refine(isAddress, "Invalid EVM address");
71
+ var solanaAddressSchema = z.string().refine(isSolanaAddress, "Invalid Solana address");
72
+ var mixedAddressSchema = z.union([ethereumAddressSchema, solanaAddressSchema]).transform((address) => address);
44
73
 
45
74
  export {
46
75
  networkSchema,
47
76
  ethereumAddressSchema,
48
77
  solanaAddressSchema,
49
78
  EVM_CONFIGS,
50
- chainId,
51
- SOLANA_CONFIG
79
+ SOLANA_CONFIG,
80
+ ALL_NETWORK_CONFIGS,
81
+ networkToCaip2,
82
+ getTxExplorerUrl,
83
+ caip2ToNetwork
52
84
  };
53
- //# sourceMappingURL=chunk-G3AVBW3H.js.map
85
+ //# sourceMappingURL=chunk-6RPXYBHW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../internal/networks/src/configs.ts","../../../../internal/networks/src/types.ts","../../../../internal/networks/src/schemas.ts"],"sourcesContent":["import { base, tempo } from 'viem/chains';\n\nimport { Network } from './types';\n\nimport type {\n EvmNetworkConfig,\n EvmNetwork,\n SolanaAddress,\n SolanaNetworkConfig,\n BaseNetworkConfig,\n} from './types';\n\nexport const EVM_CONFIGS: Record<EvmNetwork, EvmNetworkConfig> = {\n [Network.BASE]: {\n chain: base,\n name: 'Base',\n caip2: 'eip155:8453',\n usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n [Network.TEMPO]: {\n chain: tempo,\n name: 'Tempo',\n caip2: 'eip155:4217',\n usdcAddress: '0x20c0000000000000000000000000000000000000',\n },\n};\n\nexport const chainId = (network: EvmNetwork) => EVM_CONFIGS[network].chain.id;\n\nexport const SOLANA_CONFIG: SolanaNetworkConfig = {\n name: 'Solana',\n caip2: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n usdcAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as SolanaAddress,\n};\n\nexport const ALL_NETWORK_CONFIGS: Record<Network, BaseNetworkConfig> = {\n ...EVM_CONFIGS,\n [Network.SOLANA]: SOLANA_CONFIG,\n};\n\nexport const networkToCaip2 = (network: Network) => {\n if (network === Network.SOLANA) {\n return SOLANA_CONFIG.caip2;\n }\n return EVM_CONFIGS[network].caip2;\n};\n\nexport const TX_EXPLORER_URLS: Record<Network, string> = {\n [Network.BASE]: 'https://basescan.org/tx/',\n [Network.TEMPO]: 'https://testnet.tempo.xyz/tx/',\n [Network.SOLANA]: 'https://solscan.io/tx/',\n};\n\nexport const getTxExplorerUrl = (\n txHash: string,\n network: Network = Network.BASE\n) => `${TX_EXPLORER_URLS[network]}${txHash}`;\n\nexport const caip2ToNetwork = (caip2: `${string}:${string}`) => {\n if (caip2 === SOLANA_CONFIG.caip2) {\n return Network.SOLANA;\n }\n const evmNetwork = Object.entries(EVM_CONFIGS).find(\n ([, config]) => config.caip2 === caip2\n )?.[0];\n if (evmNetwork) {\n return evmNetwork as EvmNetwork;\n }\n return null;\n};\n","import type { Chain, Address as EvmAddress } from 'viem';\nimport type { Address as SolanaAddress } from '@solana/kit';\n\nexport type EthereumAddress = EvmAddress;\nexport { SolanaAddress };\nexport type MixedAddress = EthereumAddress | SolanaAddress;\n\nexport enum Network {\n BASE = 'base',\n TEMPO = 'tempo',\n SOLANA = 'solana',\n}\n\nexport type EvmNetwork = Exclude<Network, Network.SOLANA>;\n\nexport interface BaseNetworkConfig {\n caip2: `${string}:${string}`;\n name: string;\n}\n\nexport interface EvmNetworkConfig extends BaseNetworkConfig {\n chain: Chain;\n usdcAddress: EthereumAddress;\n}\n\nexport interface SolanaNetworkConfig extends BaseNetworkConfig {\n usdcAddress: SolanaAddress;\n}\n","import z from 'zod';\n\nimport { Network } from './types';\n\nimport { isAddress } from 'viem';\nimport { isAddress as isSolanaAddress } from '@solana/kit';\n\nimport type { MixedAddress, SolanaAddress, EvmNetwork } from './types';\n\nexport const networkSchema = z.enum(Network);\nexport const optionalNetworkSchema = networkSchema.optional();\n\nexport const evmNetworkSchema = networkSchema\n .refine(network => network !== Network.SOLANA, {\n message: 'Invalid EVM chain',\n })\n .transform(network => network as EvmNetwork);\n\nexport const ethereumAddressSchema = z\n .string()\n .refine(isAddress, 'Invalid EVM address');\n\nexport const solanaAddressSchema: z.ZodType<SolanaAddress, string> = z\n .string()\n .refine(isSolanaAddress, 'Invalid Solana address');\n\nexport const mixedAddressSchema: z.ZodType<MixedAddress, string> = z\n .union([ethereumAddressSchema, solanaAddressSchema])\n .transform(address => address as MixedAddress);\n"],"mappings":";AAAA,SAAS,MAAM,aAAa;;;ACOrB,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,SAAA,UAAO;AACP,EAAAA,SAAA,WAAQ;AACR,EAAAA,SAAA,YAAS;AAHC,SAAAA;AAAA,GAAA;;;ADKL,IAAM,cAAoD;AAAA,EAC/D,kBAAa,GAAG;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,oBAAc,GAAG;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAIO,IAAM,gBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AACf;AAEO,IAAM,sBAA0D;AAAA,EACrE,GAAG;AAAA,EACH,sBAAe,GAAG;AACpB;AAEO,IAAM,iBAAiB,CAAC,YAAqB;AAClD,MAAI,mCAA4B;AAC9B,WAAO,cAAc;AAAA,EACvB;AACA,SAAO,YAAY,OAAO,EAAE;AAC9B;AAEO,IAAM,mBAA4C;AAAA,EACvD,kBAAa,GAAG;AAAA,EAChB,oBAAc,GAAG;AAAA,EACjB,sBAAe,GAAG;AACpB;AAEO,IAAM,mBAAmB,CAC9B,QACA,gCACG,GAAG,iBAAiB,OAAO,CAAC,GAAG,MAAM;AAEnC,IAAM,iBAAiB,CAAC,UAAiC;AAC9D,MAAI,UAAU,cAAc,OAAO;AACjC;AAAA,EACF;AACA,QAAM,aAAa,OAAO,QAAQ,WAAW,EAAE;AAAA,IAC7C,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,UAAU;AAAA,EACnC,IAAI,CAAC;AACL,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AErEA,OAAO,OAAO;AAId,SAAS,iBAAiB;AAC1B,SAAS,aAAa,uBAAuB;AAItC,IAAM,gBAAgB,EAAE,KAAK,OAAO;AACpC,IAAM,wBAAwB,cAAc,SAAS;AAErD,IAAM,mBAAmB,cAC7B,OAAO,aAAW,mCAA4B;AAAA,EAC7C,SAAS;AACX,CAAC,EACA,UAAU,aAAW,OAAqB;AAEtC,IAAM,wBAAwB,EAClC,OAAO,EACP,OAAO,WAAW,qBAAqB;AAEnC,IAAM,sBAAwD,EAClE,OAAO,EACP,OAAO,iBAAiB,wBAAwB;AAE5C,IAAM,qBAAsD,EAChE,MAAM,CAAC,uBAAuB,mBAAmB,CAAC,EAClD,UAAU,aAAW,OAAuB;","names":["Network"]}
@@ -4,7 +4,7 @@ import { dirname, join } from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  function getVersion() {
6
6
  if (true) {
7
- return "0.9.2";
7
+ return "0.9.4";
8
8
  }
9
9
  const __dirname2 = dirname(fileURLToPath(import.meta.url));
10
10
  const pkg = JSON.parse(
@@ -19,4 +19,4 @@ export {
19
19
  MCP_VERSION,
20
20
  DIST_TAG
21
21
  };
22
- //# sourceMappingURL=chunk-CGFED7FU.js.map
22
+ //# sourceMappingURL=chunk-BZUAKI72.js.map
@@ -0,0 +1,79 @@
1
+ import {
2
+ getState
3
+ } from "./chunk-6XGAIMNK.js";
4
+ import {
5
+ getBalance
6
+ } from "./chunk-G6QIDBTO.js";
7
+ import {
8
+ getBaseUrl,
9
+ getDepositLink
10
+ } from "./chunk-OKHBFFZP.js";
11
+ import {
12
+ isMppEnabled
13
+ } from "./chunk-KKGRBCO7.js";
14
+ import {
15
+ ok
16
+ } from "./chunk-C7KWYVS3.js";
17
+
18
+ // src/operations/onboarding-cta.ts
19
+ function shouldShowOnboardingCta() {
20
+ return (getState().redeemedCodes?.length ?? 0) === 0;
21
+ }
22
+ function getOnboardingCta(address, flags) {
23
+ const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;
24
+ const depositLink = getDepositLink(address, flags);
25
+ return {
26
+ onboardLink,
27
+ depositLink,
28
+ message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`
29
+ };
30
+ }
31
+
32
+ // src/operations/wallet-info.ts
33
+ async function getWalletInfo(surface, wallets, flags) {
34
+ const {
35
+ evmAccount: {
36
+ account: { address: evmAddress }
37
+ },
38
+ svmAccount: {
39
+ account: { address: svmAddress }
40
+ }
41
+ } = wallets;
42
+ const balances = await Promise.all([
43
+ getBalance(surface, { address: evmAddress, network: "base" /* BASE */ }, flags),
44
+ getBalance(
45
+ surface,
46
+ { address: svmAddress, network: "solana" /* SOLANA */ },
47
+ flags
48
+ ),
49
+ ...isMppEnabled() ? [
50
+ getBalance(
51
+ surface,
52
+ { address: evmAddress, network: "tempo" /* TEMPO */ },
53
+ flags
54
+ )
55
+ ] : []
56
+ ]);
57
+ const chains = balances.filter((balance) => balance.isOk()).map((balance) => ({
58
+ balance: balance.value.balance,
59
+ paymentNetwork: balance.value.paymentNetwork
60
+ }));
61
+ const totalBalance = balances.filter((balance) => balance.isOk()).reduce((acc, balance) => acc + balance.value.balance, 0);
62
+ return ok({
63
+ address: evmAddress,
64
+ solanaAddress: svmAddress,
65
+ balance: totalBalance,
66
+ chains,
67
+ isNewWallet: totalBalance === 0,
68
+ depositLink: getDepositLink(evmAddress, flags),
69
+ solanaDepositLink: getDepositLink(svmAddress, flags),
70
+ ...shouldShowOnboardingCta() ? { onboardingCta: getOnboardingCta(evmAddress, flags) } : {},
71
+ ...totalBalance < 2.5 && totalBalance > 0 ? { message: "Your balance is low. Consider topping it up" } : {}
72
+ });
73
+ }
74
+
75
+ export {
76
+ getOnboardingCta,
77
+ getWalletInfo
78
+ };
79
+ //# sourceMappingURL=chunk-EV4ASZA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/operations/onboarding-cta.ts","../../src/operations/wallet-info.ts"],"sourcesContent":["import { getState } from '@/shared/state';\nimport { getBaseUrl, getDepositLink } from '@/shared/utils';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\nexport interface OnboardingCta {\n onboardLink: string;\n depositLink: string;\n message: string;\n}\n\nexport function shouldShowOnboardingCta(): boolean {\n return (getState().redeemedCodes?.length ?? 0) === 0;\n}\n\nexport function getOnboardingCta(\n address: Address,\n flags: GlobalFlags\n): OnboardingCta {\n const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;\n const depositLink = getDepositLink(address, flags);\n\n return {\n onboardLink,\n depositLink,\n message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`,\n };\n}\n","import { ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { getDepositLink } from '@/shared/utils';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport {\n shouldShowOnboardingCta,\n getOnboardingCta,\n} from '@/operations/onboarding-cta';\n\nimport type { GlobalFlags } from '@/types';\nimport type { SolanaAddress } from '@agentcash/networks';\nimport { Network } from '@agentcash/networks';\nimport type { Wallets } from '@/wallet';\n/**\n * Get wallet info including balance and deposit link.\n * Returns summed balance across Base and Tempo, with per-chain breakdown.\n */\nexport async function getWalletInfo(\n surface: string,\n wallets: Wallets,\n flags: GlobalFlags\n) {\n const {\n evmAccount: {\n account: { address: evmAddress },\n },\n svmAccount: {\n account: { address: svmAddress },\n },\n } = wallets;\n const balances = await Promise.all([\n getBalance(surface, { address: evmAddress, network: Network.BASE }, flags),\n getBalance(\n surface,\n { address: svmAddress, network: Network.SOLANA },\n flags\n ),\n ...(isMppEnabled()\n ? [\n getBalance(\n surface,\n { address: evmAddress, network: Network.TEMPO },\n flags\n ),\n ]\n : []),\n ] as const);\n\n const chains = balances\n .filter(balance => balance.isOk())\n .map(balance => ({\n balance: balance.value.balance,\n paymentNetwork: balance.value.paymentNetwork,\n }));\n\n const totalBalance = balances\n .filter(balance => balance.isOk())\n .reduce((acc, balance) => acc + balance.value.balance, 0);\n\n return ok({\n address: evmAddress,\n solanaAddress: svmAddress as SolanaAddress,\n balance: totalBalance,\n chains,\n isNewWallet: totalBalance === 0,\n depositLink: getDepositLink(evmAddress, flags),\n solanaDepositLink: getDepositLink(svmAddress, flags),\n ...(shouldShowOnboardingCta()\n ? { onboardingCta: getOnboardingCta(evmAddress, flags) }\n : {}),\n ...(totalBalance < 2.5 && totalBalance > 0\n ? { message: 'Your balance is low. Consider topping it up' }\n : {}),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAYO,SAAS,0BAAmC;AACjD,UAAQ,SAAS,EAAE,eAAe,UAAU,OAAO;AACrD;AAEO,SAAS,iBACd,SACA,OACe;AACf,QAAM,cAAc,GAAG,WAAW,MAAM,GAAG,CAAC;AAC5C,QAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,gEAAgE,WAAW,qEAAqE,WAAW;AAAA,EACtK;AACF;;;ACVA,eAAsB,cACpB,SACA,SACA,OACA;AACA,QAAM;AAAA,IACJ,YAAY;AAAA,MACV,SAAS,EAAE,SAAS,WAAW;AAAA,IACjC;AAAA,IACA,YAAY;AAAA,MACV,SAAS,EAAE,SAAS,WAAW;AAAA,IACjC;AAAA,EACF,IAAI;AACJ,QAAM,WAAW,MAAM,QAAQ,IAAI;AAAA,IACjC,WAAW,SAAS,EAAE,SAAS,YAAY,2BAAsB,GAAG,KAAK;AAAA,IACzE;AAAA,MACE;AAAA,MACA,EAAE,SAAS,YAAY,+BAAwB;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,GAAI,aAAa,IACb;AAAA,MACE;AAAA,QACE;AAAA,QACA,EAAE,SAAS,YAAY,6BAAuB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAU;AAEV,QAAM,SAAS,SACZ,OAAO,aAAW,QAAQ,KAAK,CAAC,EAChC,IAAI,cAAY;AAAA,IACf,SAAS,QAAQ,MAAM;AAAA,IACvB,gBAAgB,QAAQ,MAAM;AAAA,EAChC,EAAE;AAEJ,QAAM,eAAe,SAClB,OAAO,aAAW,QAAQ,KAAK,CAAC,EAChC,OAAO,CAAC,KAAK,YAAY,MAAM,QAAQ,MAAM,SAAS,CAAC;AAE1D,SAAO,GAAG;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,IACA,aAAa,iBAAiB;AAAA,IAC9B,aAAa,eAAe,YAAY,KAAK;AAAA,IAC7C,mBAAmB,eAAe,YAAY,KAAK;AAAA,IACnD,GAAI,wBAAwB,IACxB,EAAE,eAAe,iBAAiB,YAAY,KAAK,EAAE,IACrD,CAAC;AAAA,IACL,GAAI,eAAe,OAAO,eAAe,IACrC,EAAE,SAAS,8CAA8C,IACzD,CAAC;AAAA,EACP,CAAC;AACH;","names":[]}
@@ -2,11 +2,14 @@ import {
2
2
  getBaseUrl
3
3
  } from "./chunk-OKHBFFZP.js";
4
4
  import {
5
+ ALL_NETWORK_CONFIGS,
5
6
  EVM_CONFIGS,
7
+ SOLANA_CONFIG,
8
+ caip2ToNetwork,
6
9
  ethereumAddressSchema,
7
10
  networkSchema,
8
11
  solanaAddressSchema
9
- } from "./chunk-G3AVBW3H.js";
12
+ } from "./chunk-6RPXYBHW.js";
10
13
  import {
11
14
  safeFetchJson
12
15
  } from "./chunk-I66V4HGH.js";
@@ -23,12 +26,26 @@ var getEvmBalanceInputSchema = z.object({
23
26
  tokenAddress: ethereumAddressSchema.optional()
24
27
  });
25
28
  var getBalanceInputSchema = z.discriminatedUnion("network", [
26
- getSolanaBalanceInputSchema.extend({ network: z.literal("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */) }),
27
- getEvmBalanceInputSchema.extend({ network: z.enum(evmNetworks) })
29
+ getSolanaBalanceInputSchema.extend({
30
+ network: z.union([
31
+ z.literal("solana" /* SOLANA */),
32
+ z.literal(SOLANA_CONFIG.caip2).transform(() => "solana" /* SOLANA */)
33
+ ])
34
+ }),
35
+ getEvmBalanceInputSchema.extend({
36
+ network: z.union([
37
+ z.enum(evmNetworks),
38
+ z.enum(Object.values(EVM_CONFIGS).map((config) => config.caip2)).transform((caip2) => caip2ToNetwork(caip2))
39
+ ])
40
+ })
28
41
  ]);
29
42
  var getBalanceOutputSchema = z.object({
30
43
  balance: z.number(),
31
- network: networkSchema,
44
+ // this should be deprecated in the future
45
+ network: z.enum(
46
+ Object.values(ALL_NETWORK_CONFIGS).map((config) => config.caip2)
47
+ ),
48
+ paymentNetwork: networkSchema,
32
49
  chainId: z.number()
33
50
  });
34
51
 
@@ -50,4 +67,4 @@ var getBalance = async (surface, input, flags) => {
50
67
  export {
51
68
  getBalance
52
69
  };
53
- //# sourceMappingURL=chunk-RAFN7MFS.js.map
70
+ //# sourceMappingURL=chunk-G6QIDBTO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../internal/balance/src/index.ts","../../src/shared/balance.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport {\n ALL_NETWORK_CONFIGS,\n caip2ToNetwork,\n ethereumAddressSchema,\n EVM_CONFIGS,\n EvmNetwork,\n Network,\n networkSchema,\n SOLANA_CONFIG,\n solanaAddressSchema,\n} from '@agentcash/networks';\n\nconst evmNetworks = Object.keys(EVM_CONFIGS) as EvmNetwork[];\n\nexport const getSolanaBalanceInputSchema = z.object({\n address: solanaAddressSchema,\n tokenAddress: solanaAddressSchema.optional(),\n});\n\nexport const getEvmBalanceInputSchema = z.object({\n address: ethereumAddressSchema,\n tokenAddress: ethereumAddressSchema.optional(),\n});\n\nexport const getBalanceInputSchema = z.discriminatedUnion('network', [\n getSolanaBalanceInputSchema.extend({\n network: z.union([\n z.literal(Network.SOLANA),\n z.literal(SOLANA_CONFIG.caip2).transform(() => Network.SOLANA as const),\n ]),\n }),\n getEvmBalanceInputSchema.extend({\n network: z.union([\n z.enum(evmNetworks),\n z\n .enum(Object.values(EVM_CONFIGS).map(config => config.caip2))\n .transform(caip2 => caip2ToNetwork(caip2)! as EvmNetwork),\n ]),\n }),\n]);\n\nexport const getBalanceOutputSchema = z.object({\n balance: z.number(),\n // this should be deprecated in the future\n network: z.enum(\n Object.values(ALL_NETWORK_CONFIGS).map(config => config.caip2)\n ),\n paymentNetwork: networkSchema,\n chainId: z.number(),\n});\n\nexport type GetBalanceInput = z.infer<typeof getBalanceInputSchema>;\nexport type GetSolanaBalanceInput = Extract<\n GetBalanceInput,\n { network: typeof Network.SOLANA }\n>;\nexport type GetEvmBalanceInput = Extract<\n GetBalanceInput,\n { network: EvmNetwork }\n>;\nexport type GetBalanceOutput = z.infer<typeof getBalanceOutputSchema>;\n","import { getBaseUrl } from '@/shared/utils';\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\n\nimport { getBalanceOutputSchema } from '@agentcash/balance';\n\nimport type { GetBalanceInput } from '@agentcash/balance';\nimport type { GlobalFlags } from '@/types';\n\nexport const getBalance = async (\n surface: string,\n input: GetBalanceInput,\n flags: GlobalFlags\n) => {\n return await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(flags.dev)}/api/balance`, {\n method: 'POST',\n body: JSON.stringify(input),\n headers: {\n accept: 'application/json',\n },\n }),\n getBalanceOutputSchema\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAclB,IAAM,cAAc,OAAO,KAAK,WAAW;AAEpC,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,SAAS;AAAA,EACT,cAAc,oBAAoB,SAAS;AAC7C,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,SAAS;AAAA,EACT,cAAc,sBAAsB,SAAS;AAC/C,CAAC;AAEM,IAAM,wBAAwB,EAAE,mBAAmB,WAAW;AAAA,EACnE,4BAA4B,OAAO;AAAA,IACjC,SAAS,EAAE,MAAM;AAAA,MACf,EAAE,6BAAsB;AAAA,MACxB,EAAE,QAAQ,cAAc,KAAK,EAAE,UAAU,2BAA6B;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AAAA,EACD,yBAAyB,OAAO;AAAA,IAC9B,SAAS,EAAE,MAAM;AAAA,MACf,EAAE,KAAK,WAAW;AAAA,MAClB,EACG,KAAK,OAAO,OAAO,WAAW,EAAE,IAAI,YAAU,OAAO,KAAK,CAAC,EAC3D,UAAU,WAAS,eAAe,KAAK,CAAgB;AAAA,IAC5D,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,SAAS,EAAE,OAAO;AAAA;AAAA,EAElB,SAAS,EAAE;AAAA,IACT,OAAO,OAAO,mBAAmB,EAAE,IAAI,YAAU,OAAO,KAAK;AAAA,EAC/D;AAAA,EACA,gBAAgB;AAAA,EAChB,SAAS,EAAE,OAAO;AACpB,CAAC;;;AC3CM,IAAM,aAAa,OACxB,SACA,OACA,UACG;AACH,SAAO,MAAM;AAAA,IACX;AAAA,IACA,IAAI,QAAQ,GAAG,WAAW,MAAM,GAAG,CAAC,gBAAgB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1B,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AACF;","names":[]}
@@ -5,19 +5,20 @@ import {
5
5
  x402Err,
6
6
  x402Ok,
7
7
  x402ProbeClient
8
- } from "./chunk-6FEDQ4HI.js";
8
+ } from "./chunk-O3TDXKU6.js";
9
9
  import {
10
10
  getBalance
11
- } from "./chunk-RAFN7MFS.js";
11
+ } from "./chunk-G6QIDBTO.js";
12
12
  import {
13
13
  tokenStringToNumber
14
14
  } from "./chunk-OKHBFFZP.js";
15
15
  import {
16
16
  isMppEnabled
17
- } from "./chunk-GQTOWVH6.js";
17
+ } from "./chunk-KKGRBCO7.js";
18
18
  import {
19
- networkSchema
20
- } from "./chunk-G3AVBW3H.js";
19
+ caip2ToNetwork,
20
+ networkToCaip2
21
+ } from "./chunk-6RPXYBHW.js";
21
22
  import {
22
23
  BLACKLISTED_ORIGINS
23
24
  } from "./chunk-TTAO2EJK.js";
@@ -153,7 +154,7 @@ async function pickByBalance(response, options) {
153
154
  surface,
154
155
  {
155
156
  address: wallets.evmAccount.account.address,
156
- network: "eip155:8453" /* BASE */
157
+ network: "base" /* BASE */
157
158
  },
158
159
  flags
159
160
  ).then((r) => r.isOk() ? r.value.balance : 0),
@@ -177,7 +178,7 @@ async function pickByBalance(response, options) {
177
178
  surface,
178
179
  {
179
180
  address: wallets.evmAccount.account.address,
180
- network: "eip155:4217" /* TEMPO */
181
+ network: "tempo" /* TEMPO */
181
182
  },
182
183
  flags
183
184
  );
@@ -226,7 +227,7 @@ async function handleMppPayment({
226
227
  protocol: "mpp",
227
228
  amount,
228
229
  currency,
229
- network: "eip155:4217" /* TEMPO */
230
+ network: "tempo" /* TEMPO */
230
231
  }),
231
232
  (e) => ({
232
233
  cause: "before_payment_hook_failed",
@@ -275,25 +276,24 @@ var choosePaymentRequirement = async ({
275
276
  }) => {
276
277
  const { surface, paymentNetwork, wallets, flags } = options;
277
278
  if (paymentNetwork) {
278
- return paymentRequirements.find(
279
- (pr) => pr.network === paymentNetwork
280
- );
279
+ const caip2 = networkToCaip2(paymentNetwork);
280
+ return paymentRequirements.find((pr) => pr.network === caip2);
281
281
  }
282
282
  const requirementsWithBalance = await Promise.all(
283
283
  paymentRequirements.map(async (pr) => {
284
- const parsedNetwork = networkSchema.safeParse(pr.network);
285
- if (!parsedNetwork.success) {
284
+ const network = caip2ToNetwork(pr.network);
285
+ if (network === null) {
286
286
  return {
287
287
  balance: 0,
288
288
  requirement: pr
289
289
  };
290
290
  }
291
- if (parsedNetwork.data === "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */) {
291
+ if (network === "solana" /* SOLANA */) {
292
292
  const balanceResult = await getBalance(
293
293
  surface,
294
294
  {
295
295
  address: wallets.svmAccount.account.address,
296
- network: parsedNetwork.data
296
+ network
297
297
  },
298
298
  flags
299
299
  );
@@ -306,7 +306,7 @@ var choosePaymentRequirement = async ({
306
306
  surface,
307
307
  {
308
308
  address: wallets.evmAccount.account.address,
309
- network: parsedNetwork.data
309
+ network
310
310
  },
311
311
  flags
312
312
  );
@@ -366,7 +366,7 @@ async function handleX402Payment({
366
366
  protocol: "x402",
367
367
  amount: amount2,
368
368
  currency: "USDC",
369
- network: accept.network
369
+ network: caip2ToNetwork(accept.network)
370
370
  }),
371
371
  (e) => ({
372
372
  cause: "payment_already_attempted",
@@ -500,4 +500,4 @@ export {
500
500
  DEFAULT_MAX_AMOUNT,
501
501
  createFetchWithPayment
502
502
  };
503
- //# sourceMappingURL=chunk-PGMMXO5J.js.map
503
+ //# sourceMappingURL=chunk-GQW673BP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/settings.ts","../../src/shared/protocols/detect.ts","../../src/shared/protocols/mpp/index.ts","../../src/shared/protocols/pick.ts","../../src/shared/protocols/mpp/handle-payment.ts","../../src/shared/protocols/x402/choose-payment-requirement.ts","../../src/shared/protocols/x402/handle-payment.ts","../../src/operations/fetch-with-payment.ts"],"sourcesContent":["import z from 'zod';\nimport fs from 'fs';\n\nimport { configFile } from './fs';\n\nconst SETTINGS_FILE = configFile('settings.json');\n\nconst settingsSchema = z\n .looseObject({\n maxAmount: z.number().positive(),\n })\n .partial();\n\nexport type Settings = z.infer<typeof settingsSchema>;\n\nexport const getSettings = (): Settings => {\n if (!fs.existsSync(SETTINGS_FILE)) {\n return {};\n }\n\n const content = fs.readFileSync(SETTINGS_FILE, 'utf-8');\n const result = settingsSchema.safeParse(JSON.parse(content));\n if (!result.success) {\n return {};\n }\n return result.data;\n};\n\nexport const setSettings = (settings: Settings) => {\n const existing = getSettings();\n const newSettings = settingsSchema.parse({ ...existing, ...settings });\n fs.writeFileSync(SETTINGS_FILE, JSON.stringify(newSettings, null, 2));\n};\n","import { isMppEnabled } from '@/shared/mpp-enabled';\nimport type { PaymentProtocol } from './types';\n\n/**\n * Detects all payment protocols present in a 402 response.\n * MPP responses include a `WWW-Authenticate` header starting with \"Payment\".\n * x402 responses include a `payment-required` header.\n * If neither is explicitly detected, defaults to x402.\n *\n * MPP detection is gated behind {@link isMppEnabled} so it never surfaces\n * in agent context on the `latest` dist-tag.\n */\nexport function detectPaymentProtocols(response: Response): PaymentProtocol[] {\n const protocols: PaymentProtocol[] = [];\n if (isMppEnabled()) {\n const wwwAuth = response.headers.get('WWW-Authenticate');\n if (wwwAuth?.startsWith('Payment')) {\n protocols.push('mpp');\n }\n }\n const paymentRequired = response.headers.get('payment-required');\n if (paymentRequired) {\n protocols.push('x402');\n }\n // If we couldn't detect either explicitly, default to x402\n if (protocols.length === 0) {\n protocols.push('x402');\n }\n return protocols;\n}\n","import { Challenge, Receipt } from 'mppx';\nimport { Methods } from 'mppx/tempo';\nimport {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport { Mppx, tempo as tempoMethod } from 'mppx/client';\n\nimport { createClient, http } from 'viem';\nimport { tempo } from 'viem/chains';\n\nimport { isMppEnabled } from '@/shared/mpp-enabled';\n\nimport type { BaseMppError } from './types';\nimport type { Wallets } from '@/wallet';\n\nconst errorType = 'mpp';\n\nexport const mppOk = <T>(value: T) => ok(value);\nexport const mppErr = (surface: string, error: BaseMppError) =>\n err(errorType, surface, error);\n\nconst mppResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseMppError\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst mppResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseMppError\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const safeGetMppChallenge = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Challenge.fromResponse(response, { methods: [Methods.charge] }),\n error => ({\n cause: 'parse_mpp_challenge',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP challenge from response',\n })\n );\n};\n\nexport const safeCreateMppCredential = (\n surface: string,\n wallets: Wallets,\n response: Response\n) => {\n if (!isMppEnabled()) {\n return mppErr(surface, {\n cause: 'mpp_disabled',\n message: 'MPP is not enabled',\n });\n }\n\n const TEMPO_RPC_URL =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\n\n const client = Mppx.create({\n polyfill: false,\n methods: [\n tempoMethod({\n account: wallets.evmAccount.account,\n getClient: () =>\n createClient({\n chain: tempo,\n transport: http(TEMPO_RPC_URL),\n }),\n }),\n ],\n });\n\n return mppResultFromPromise(\n surface,\n client.createCredential(response),\n error => ({\n cause: 'create_mpp_credential',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create MPP credential',\n })\n );\n};\n\nexport const safeGetMppReceipt = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Receipt.fromResponse(response),\n error => ({\n cause: 'parse_mpp_receipt',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP receipt from response',\n })\n );\n};\n","import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeGetMppChallenge } from '@/shared/protocols/mpp';\n\nimport { log } from '@/shared/log';\nimport { getBalance } from '@/shared/balance';\nimport { Network } from '@agentcash/networks';\n\nimport type { FetchWithPaymentOptions } from '@/operations/fetch-with-payment';\n\n/**\n * Pick the preferred protocol by comparing wallet balances.\n * Falls back to 'mpp' if both balances fail to fetch.\n */\nexport async function pickByBalance(\n response: Response,\n options: FetchWithPaymentOptions\n): Promise<'x402' | 'mpp'> {\n const { surface, wallets, flags } = options;\n\n // Get x402 (USDC on Base) balance\n const x402BalanceResult = await resultFromPromise(\n 'balance',\n surface,\n getBalance(\n surface,\n {\n address: wallets.evmAccount.account.address,\n network: Network.BASE,\n },\n flags\n ).then(r => (r.isOk() ? r.value.balance : 0)),\n () => ({\n cause: 'x402_balance' as const,\n message: 'Failed to get x402 balance',\n })\n );\n\n if (x402BalanceResult.isErr()) {\n log.debug('Balance comparison failed, defaulting to mpp');\n return 'mpp';\n }\n\n const x402Balance = x402BalanceResult.value;\n\n // Get MPP (Tempo) balance — need token address from the challenge\n let mppBalance = 0;\n const challengeResult = safeGetMppChallenge(surface, response);\n if (challengeResult.isOk()) {\n const currency = challengeResult.value.request.currency as\n | string\n | undefined;\n const decimals = 6;\n if (currency) {\n const tempoResult = await getBalance(\n surface,\n {\n address: wallets.evmAccount.account.address,\n network: Network.TEMPO,\n },\n flags\n );\n if (tempoResult.isOk()) {\n mppBalance = Number(tempoResult.value.balance ?? (0).toFixed(decimals));\n }\n }\n }\n\n log.info(`Protocol selection — x402: $${x402Balance}, mpp: $${mppBalance}`);\n return x402Balance >= mppBalance ? 'x402' : 'mpp';\n}\n","import { formatUnits } from 'viem';\n\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeGetMppChallenge,\n safeCreateMppCredential,\n safeGetMppReceipt,\n mppErr,\n mppOk,\n} from '@/shared/protocols/mpp';\n\nimport type { FetchWithPaymentResult } from '@/operations/fetch-with-payment';\nimport type { HandlePaymentParams } from '../types';\nimport { Network } from '@agentcash/networks';\n\nexport async function handleMppPayment({\n response,\n clonedRequest,\n options,\n maxAmount,\n}: HandlePaymentParams) {\n const { surface, wallets, beforePayment, timeout } = options;\n\n // Prevent retry loops\n if (clonedRequest.headers.has('Authorization')) {\n return mppErr(surface, {\n cause: 'mpp_payment_already_attempted',\n message: 'MPP payment already attempted',\n });\n }\n\n // Parse the challenge from the WWW-Authenticate header\n const challengeResult = safeGetMppChallenge(surface, response);\n\n if (challengeResult.isErr()) {\n return challengeResult;\n }\n\n const challenge = challengeResult.value;\n\n // Extract payment info from challenge request\n const amount = Number(formatUnits(BigInt(challenge.request.amount), 6));\n const currency = challenge.request.currency;\n\n if (amount > maxAmount) {\n return mppErr(surface, {\n cause: 'mpp_payment_amount_exceeds_max_amount' as const,\n message: `Endpoint requested $${amount} which exceeds the maximum allowed amount of $${maxAmount}. Pass a higher maxAmount on this call, or use update_settings to raise the default permanently.`,\n });\n }\n\n if (beforePayment) {\n const hookResult = await resultFromPromise(\n 'mpp',\n surface,\n beforePayment({\n protocol: 'mpp',\n amount,\n currency,\n network: Network.TEMPO,\n }),\n e => ({\n cause: 'before_payment_hook_failed' as const,\n message: e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return mppErr(surface, hookResult.error);\n }\n }\n\n const credentialResult = await safeCreateMppCredential(\n surface,\n wallets,\n response\n );\n\n if (credentialResult.isErr()) {\n return credentialResult;\n }\n\n const credential = credentialResult.value;\n\n // Set Authorization header on cloned request\n clonedRequest.headers.set('Authorization', credential);\n\n // Retry the fetch with the credential\n return await safeFetch(surface, clonedRequest, timeout).andThen(\n paidResponse => {\n // Parse the receipt for transaction hash\n const receiptResult = safeGetMppReceipt(surface, paidResponse);\n\n return mppOk<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'mpp',\n price: amount.toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n payment: receiptResult.isOk()\n ? {\n success: true,\n transactionHash: receiptResult.value.reference,\n }\n : null,\n },\n });\n }\n );\n}\n","import { getBalance } from '@/shared/balance';\nimport { caip2ToNetwork, Network, networkToCaip2 } from '@agentcash/networks';\n\nimport type { PaymentRequirements } from '@x402/core/types';\nimport type { FetchWithPaymentOptions } from '@/operations/fetch-with-payment';\n\ninterface ChoosePaymentRequirementParams {\n paymentRequirements: PaymentRequirements[];\n options: FetchWithPaymentOptions;\n}\n\nexport const choosePaymentRequirement = async ({\n paymentRequirements,\n options,\n}: ChoosePaymentRequirementParams) => {\n const { surface, paymentNetwork, wallets, flags } = options;\n if (paymentNetwork) {\n const caip2 = networkToCaip2(paymentNetwork);\n return paymentRequirements.find(pr => pr.network === caip2);\n }\n\n const requirementsWithBalance = await Promise.all(\n paymentRequirements.map(async pr => {\n const network = caip2ToNetwork(pr.network);\n if (network === null) {\n return {\n balance: 0,\n requirement: pr,\n };\n }\n if (network === Network.SOLANA) {\n const balanceResult = await getBalance(\n surface,\n {\n address: wallets.svmAccount.account.address,\n network,\n },\n flags\n );\n return {\n requirement: pr,\n balance: balanceResult.isOk() ? balanceResult.value.balance : 0,\n };\n } else {\n const balanceResult = await getBalance(\n surface,\n {\n address: wallets.evmAccount.account.address,\n network,\n },\n flags\n );\n return {\n requirement: pr,\n balance: balanceResult.isOk() ? balanceResult.value.balance : 0,\n };\n }\n })\n );\n return requirementsWithBalance.sort((a, b) => b.balance - a.balance)[0]!\n .requirement;\n};\n","import { resultFromPromise } from '@agentcash/neverthrow';\nimport { caip2ToNetwork } from '@agentcash/networks';\n\nimport { choosePaymentRequirement } from './choose-payment-requirement';\n\nimport { safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n safeGetPaymentSettlement,\n x402Err,\n x402Ok,\n x402ProbeClient,\n} from '@/shared/protocols/x402';\nimport { tokenStringToNumber } from '@/shared/utils';\n\nimport type { FetchWithPaymentResult } from '@/operations/fetch-with-payment';\nimport type { HandlePaymentParams } from '../types';\n\nexport async function handleX402Payment({\n response,\n clonedRequest,\n options,\n maxAmount,\n}: HandlePaymentParams) {\n const { surface, wallets, beforePayment, timeout } = options;\n\n const paymentRequiredResult = await safeGetPaymentRequired(surface, response);\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const paymentRequired = paymentRequiredResult.value;\n\n if (paymentRequired.x402Version === 1) {\n return x402Err(surface, {\n cause: 'parse_payment_required' as const,\n message:\n 'This endpoint uses the x402 v1 format, which is not supported by agentcash. Only x402 v2 servers (with an `accepts` array in the Payment-Required header) are supported.',\n });\n }\n\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n return x402Err(surface, {\n cause: 'parse_payment_required' as const,\n message:\n 'This endpoint has a missing or malformed accepts array in the Payment-Required header.',\n });\n }\n\n // Check amount against maxAmount before any payment logic\n const accept = await choosePaymentRequirement({\n options,\n paymentRequirements: paymentRequired.accepts,\n });\n\n if (accept) {\n const amount = tokenStringToNumber(accept.amount);\n if (amount > maxAmount) {\n return x402Err(surface, {\n cause: 'payment_amount_exceeds_max_amount' as const,\n message: `Endpoint requested $${amount} which exceeds the maximum allowed amount of $${maxAmount}. Pass a higher maxAmount on this call, or use update_settings to raise the default permanently.`,\n });\n }\n\n if (beforePayment) {\n const amount = tokenStringToNumber(accept.amount);\n const hookResult = await resultFromPromise(\n 'x402',\n surface,\n beforePayment({\n protocol: 'x402',\n amount,\n currency: 'USDC',\n network: caip2ToNetwork(accept.network)!,\n }),\n e => ({\n cause: 'payment_already_attempted' as const,\n message:\n e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return x402Err(surface, hookResult.error);\n }\n }\n }\n\n const paymentPayloadResult = await safeCreatePaymentPayload(\n surface,\n wallets,\n paymentRequired,\n accept ? () => accept : undefined\n );\n\n if (paymentPayloadResult.isErr()) {\n return paymentPayloadResult;\n }\n\n const paymentPayload = paymentPayloadResult.value;\n\n // Encode payment header\n const paymentHeaders =\n x402ProbeClient.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (\n clonedRequest.headers.has('PAYMENT-SIGNATURE') ||\n clonedRequest.headers.has('X-PAYMENT')\n ) {\n return x402Err(surface, {\n cause: 'payment_already_attempted',\n message: 'Payment already attempted',\n });\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n 'Access-Control-Expose-Headers',\n 'PAYMENT-RESPONSE,X-PAYMENT-RESPONSE'\n );\n\n // Retry the request with payment\n return await safeFetch(surface, clonedRequest, timeout).andThen(\n paidResponse => {\n const settlementResult = safeGetPaymentSettlement(surface, paidResponse);\n\n return x402Ok<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'x402',\n price: tokenStringToNumber(\n paymentPayload.accepted.amount\n ).toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n payment: settlementResult.isOk()\n ? {\n success: settlementResult.value.success,\n transactionHash: settlementResult.value.transaction,\n }\n : null,\n },\n });\n }\n );\n}\n","import type { GlobalFlags } from '@/types';\n\nimport { fetchErr, fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\n\nimport { detectPaymentProtocols } from '@/shared/protocols/detect';\nimport { pickByBalance } from '@/shared/protocols/pick';\n\nimport { handleMppPayment } from '@/shared/protocols/mpp/handle-payment';\nimport { handleX402Payment } from '@/shared/protocols/x402/handle-payment';\n\nimport { getSettings } from '@/shared/settings';\nimport { BLACKLISTED_ORIGINS } from '@/shared/origins';\n\nimport type { Wallets } from '@/wallet';\nimport type { PaymentProtocol } from '@/shared/protocols/types';\nimport type { Network } from '@agentcash/networks';\n\n/**\n * Hook called before a payment is executed.\n * Throw to abort. Return to proceed.\n * Matches existing checkBalance/checkTempoBalance throw-to-abort behavior.\n */\nexport type BeforePaymentHook = (ctx: {\n protocol: PaymentProtocol;\n amount: number;\n currency: string;\n network: Network;\n}) => Promise<void>;\n\nexport interface FetchWithPaymentResult {\n response: Response;\n paymentInfo: null | {\n protocol: PaymentProtocol;\n price: string;\n payment: {\n success: boolean;\n transactionHash: string;\n } | null;\n };\n}\n\n/** Default max amount (in USD/USDC) allowed without explicit opt-in. */\nexport const DEFAULT_MAX_AMOUNT = 5;\n\nexport interface FetchWithPaymentOptions {\n surface: string;\n wallets: Wallets;\n flags: GlobalFlags;\n paymentMethod?: PaymentProtocol;\n paymentNetwork?: Network;\n beforePayment?: BeforePaymentHook;\n timeout?: number;\n maxAmount?: number;\n}\n\n/**\n * Create a fetch function with automatic dual-protocol payment handling.\n *\n * 1. Makes initial request\n * 2. If 402 response, detects protocol(s)\n * 3. Calls beforePayment hook (for balance checks)\n * 4. Creates payment credential/payload\n * 5. Retries request with payment headers\n */\nexport function createFetchWithPayment(options: FetchWithPaymentOptions) {\n const { surface, paymentMethod, timeout, maxAmount } = options;\n const effectiveMaxAmount =\n maxAmount ?? getSettings().maxAmount ?? DEFAULT_MAX_AMOUNT;\n\n return async (request: Request) => {\n const blocked = BLACKLISTED_ORIGINS.find(origin =>\n request.url.startsWith(origin)\n );\n if (blocked) {\n return fetchErr(surface, {\n cause: 'network',\n message: `${blocked} is no longer available. This origin has been deprecated.`,\n });\n }\n\n const clonedRequest = request.clone();\n const fallbackRequest = request.clone();\n\n const probeResult = await safeFetch(surface, request, timeout);\n\n if (probeResult.isErr()) {\n return fetchErr(surface, probeResult.error);\n }\n\n // Not a 402 response — return as-is\n if (probeResult.value.status !== 402) {\n return probeResult.andThen(response =>\n fetchOk<FetchWithPaymentResult>({ response, paymentInfo: null })\n );\n }\n\n const response = probeResult.value;\n\n // User explicitly chose a protocol — use that, no fallback\n if (paymentMethod) {\n const handler = getHandler(paymentMethod);\n return handler({\n response,\n clonedRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n }\n\n // Auto: detect available protocols, pick by higher balance\n const available = detectPaymentProtocols(response);\n\n const preferred =\n available.length === 1\n ? available[0]!\n : await pickByBalance(response, options);\n\n const fallback =\n available.length > 1 ? (preferred === 'mpp' ? 'x402' : 'mpp') : null;\n\n const preferredHandler = getHandler(preferred);\n\n const result = await preferredHandler({\n response,\n clonedRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n\n if (result.isErr() && fallback) {\n const fallbackHandler = getHandler(fallback);\n return fallbackHandler({\n response,\n clonedRequest: fallbackRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n }\n\n return result;\n };\n}\n\nconst getHandler = (protocol: PaymentProtocol) => {\n switch (protocol) {\n case 'mpp':\n return handleMppPayment;\n case 'x402':\n return handleX402Payment;\n default:\n throw new Error(`Unknown protocol: ${protocol as string}`);\n }\n};\n"],"mappings":"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","names":["amount","response"]}
@@ -3,13 +3,14 @@ import {
3
3
  } from "./chunk-DZNSJ2BA.js";
4
4
  import {
5
5
  redeemInviteCode
6
- } from "./chunk-CM6NIM6K.js";
6
+ } from "./chunk-WTIOX2O6.js";
7
7
  import {
8
8
  getDepositLink
9
9
  } from "./chunk-OKHBFFZP.js";
10
10
  import {
11
- EVM_CONFIGS
12
- } from "./chunk-G3AVBW3H.js";
11
+ EVM_CONFIGS,
12
+ getTxExplorerUrl
13
+ } from "./chunk-6RPXYBHW.js";
13
14
 
14
15
  // src/cli/lib/deposit.ts
15
16
  import chalk from "chalk";
@@ -54,7 +55,7 @@ var promptDeposit = async (props) => {
54
55
  } else if (depositChoice === "manual") {
55
56
  log.step(chalk.bold("Account Information"));
56
57
  log.message(`Address: ${wallets.evmAccount.account.address}`);
57
- log.message(`Network: ${EVM_CONFIGS["eip155:8453" /* BASE */].name}`);
58
+ log.message(`Network: ${EVM_CONFIGS["base" /* BASE */].name}`);
58
59
  log.step(chalk.bold("Online Portal"));
59
60
  log.message(`${chalk.underline(depositLink)}`);
60
61
  } else if (depositChoice === "invite") {
@@ -75,6 +76,7 @@ var promptDeposit = async (props) => {
75
76
  const redeemResult = await redeemInviteCode({
76
77
  code,
77
78
  address: wallets.evmAccount.account.address,
79
+ solanaAddr: wallets.svmAccount.account.address,
78
80
  surface: "redeemInvite"
79
81
  });
80
82
  if (redeemResult.isErr()) {
@@ -83,7 +85,7 @@ var promptDeposit = async (props) => {
83
85
  return promptDeposit({ wallets, flags, surface });
84
86
  }
85
87
  s.stop("Invite code redeemed successfully!");
86
- const { amount, txHash } = redeemResult.value;
88
+ const { amount, txHash, network } = redeemResult.value;
87
89
  await wait({
88
90
  startText: "Processing...",
89
91
  stopText: chalk.green(
@@ -93,7 +95,10 @@ var promptDeposit = async (props) => {
93
95
  });
94
96
  log.success(chalk.bold(`Your wallet has been funded with ${amount} USDC`));
95
97
  if (txHash) {
96
- log.info(chalk.dim(`Transaction: https://basescan.org/tx/${txHash}`));
98
+ const resolvedNetwork = network === "solana" ? "solana" /* SOLANA */ : "base" /* BASE */;
99
+ log.info(
100
+ chalk.dim(`Transaction: ${getTxExplorerUrl(txHash, resolvedNetwork)}`)
101
+ );
97
102
  }
98
103
  return;
99
104
  }
@@ -102,4 +107,4 @@ var promptDeposit = async (props) => {
102
107
  export {
103
108
  promptDeposit
104
109
  };
105
- //# sourceMappingURL=chunk-ST5ITYIM.js.map
110
+ //# sourceMappingURL=chunk-HKNVLD7T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/lib/deposit.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { select, text, log, spinner } from '@clack/prompts';\nimport open from 'open';\n\nimport { wait } from './wait';\nimport { getDepositLink } from '../../shared/utils';\nimport { redeemInviteCode } from '../../shared/redeem-invite';\n\nimport type { GlobalFlags } from '@/types';\nimport { EVM_CONFIGS, Network, getTxExplorerUrl } from '@agentcash/networks';\nimport type { Wallets } from '@/wallet';\n\ninterface PromptDepositProps {\n wallets: Wallets;\n flags: GlobalFlags;\n surface: string;\n}\n\nexport const promptDeposit = async (\n props: PromptDepositProps\n): Promise<void> => {\n const { wallets, flags, surface } = props;\n\n const depositLink = getDepositLink(wallets.evmAccount.account.address, flags);\n\n const depositChoice =\n flags.yes || surface === 'guided'\n ? 'manual'\n : await select({\n message: chalk.bold('How would you like to deposit?'),\n initialValue: 'guided' as string | undefined,\n options: [\n {\n label: 'Guided - Recommended',\n value: 'guided',\n hint: 'Online portal in agentcash',\n },\n {\n label: 'Manual',\n value: 'manual',\n hint: 'Print deposit instructions',\n },\n {\n label: 'Redeem Invite Code',\n value: 'invite',\n hint: 'Enter an invite code for starter money',\n },\n {\n label: 'Skip',\n value: undefined,\n hint: 'Skip deposit process - functionality limited',\n },\n ],\n });\n\n if (depositChoice === 'guided') {\n await wait({\n startText: 'Opening deposit page...',\n stopText: `Opening ${chalk.underline.hex('#2563eb')(depositLink)}`,\n ms: 1000,\n });\n\n await open(depositLink);\n } else if (depositChoice === 'manual') {\n log.step(chalk.bold('Account Information'));\n\n log.message(`Address: ${wallets.evmAccount.account.address}`);\n log.message(`Network: ${EVM_CONFIGS[Network.BASE].name}`);\n\n log.step(chalk.bold('Online Portal'));\n log.message(`${chalk.underline(depositLink)}`);\n } else if (depositChoice === 'invite') {\n const code = await text({\n message: 'Enter your invite code',\n placeholder: 'MRT-XXXXX',\n validate: value => {\n if (!value || value.trim().length === 0) {\n return 'Please enter an invite code';\n }\n },\n });\n\n if (typeof code !== 'string') {\n return promptDeposit({ wallets, flags, surface });\n }\n\n const s = spinner();\n s.start('Redeeming invite code...');\n\n const redeemResult = await redeemInviteCode({\n code,\n address: wallets.evmAccount.account.address,\n solanaAddr: wallets.svmAccount.account.address,\n surface: 'redeemInvite',\n });\n\n if (redeemResult.isErr()) {\n s.stop('Invite code redemption failed');\n log.error('Failed to redeem invite code');\n return promptDeposit({ wallets, flags, surface });\n }\n\n s.stop('Invite code redeemed successfully!');\n\n const { amount, txHash, network } = redeemResult.value;\n\n await wait({\n startText: 'Processing...',\n stopText: chalk.green(\n `${chalk.bold(amount)} USDC has been sent to your wallet!`\n ),\n ms: 1500,\n });\n\n log.success(chalk.bold(`Your wallet has been funded with ${amount} USDC`));\n\n if (txHash) {\n const resolvedNetwork =\n network === 'solana' ? Network.SOLANA : Network.BASE;\n log.info(\n chalk.dim(`Transaction: ${getTxExplorerUrl(txHash, resolvedNetwork)}`)\n );\n }\n\n return;\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,WAAW;AAClB,SAAS,QAAQ,MAAM,KAAK,eAAe;AAC3C,OAAO,UAAU;AAgBV,IAAM,gBAAgB,OAC3B,UACkB;AAClB,QAAM,EAAE,SAAS,OAAO,QAAQ,IAAI;AAEpC,QAAM,cAAc,eAAe,QAAQ,WAAW,QAAQ,SAAS,KAAK;AAE5E,QAAM,gBACJ,MAAM,OAAO,YAAY,WACrB,WACA,MAAM,OAAO;AAAA,IACX,SAAS,MAAM,KAAK,gCAAgC;AAAA,IACpD,cAAc;AAAA,IACd,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAEP,MAAI,kBAAkB,UAAU;AAC9B,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,UAAU,WAAW,MAAM,UAAU,IAAI,SAAS,EAAE,WAAW,CAAC;AAAA,MAChE,IAAI;AAAA,IACN,CAAC;AAED,UAAM,KAAK,WAAW;AAAA,EACxB,WAAW,kBAAkB,UAAU;AACrC,QAAI,KAAK,MAAM,KAAK,qBAAqB,CAAC;AAE1C,QAAI,QAAQ,YAAY,QAAQ,WAAW,QAAQ,OAAO,EAAE;AAC5D,QAAI,QAAQ,YAAY,6BAAwB,EAAE,IAAI,EAAE;AAExD,QAAI,KAAK,MAAM,KAAK,eAAe,CAAC;AACpC,QAAI,QAAQ,GAAG,MAAM,UAAU,WAAW,CAAC,EAAE;AAAA,EAC/C,WAAW,kBAAkB,UAAU;AACrC,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,WAAS;AACjB,YAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,cAAc,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,IAClD;AAEA,UAAM,IAAI,QAAQ;AAClB,MAAE,MAAM,0BAA0B;AAElC,UAAM,eAAe,MAAM,iBAAiB;AAAA,MAC1C;AAAA,MACA,SAAS,QAAQ,WAAW,QAAQ;AAAA,MACpC,YAAY,QAAQ,WAAW,QAAQ;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AAED,QAAI,aAAa,MAAM,GAAG;AACxB,QAAE,KAAK,+BAA+B;AACtC,UAAI,MAAM,8BAA8B;AACxC,aAAO,cAAc,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,IAClD;AAEA,MAAE,KAAK,oCAAoC;AAE3C,UAAM,EAAE,QAAQ,QAAQ,QAAQ,IAAI,aAAa;AAEjD,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,UAAU,MAAM;AAAA,QACd,GAAG,MAAM,KAAK,MAAM,CAAC;AAAA,MACvB;AAAA,MACA,IAAI;AAAA,IACN,CAAC;AAED,QAAI,QAAQ,MAAM,KAAK,oCAAoC,MAAM,OAAO,CAAC;AAEzE,QAAI,QAAQ;AACV,YAAM,kBACJ,YAAY;AACd,UAAI;AAAA,QACF,MAAM,IAAI,gBAAgB,iBAAiB,QAAQ,eAAe,CAAC,EAAE;AAAA,MACvE;AAAA,IACF;AAEA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,7 @@
1
+ // src/shared/mpp-enabled.ts
2
+ var isMppEnabled = () => "0.9.4".includes("-mpp");
3
+
4
+ export {
5
+ isMppEnabled
6
+ };
7
+ //# sourceMappingURL=chunk-KKGRBCO7.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ networkToCaip2
3
+ } from "./chunk-6RPXYBHW.js";
1
4
  import {
2
5
  err,
3
6
  ok,
@@ -195,7 +198,7 @@ var safeCreatePaymentPayload = (surface, wallets, paymentRequired, paymentRequir
195
198
  x402Client.fromConfig({
196
199
  schemes: [
197
200
  {
198
- network: "eip155:8453" /* BASE */,
201
+ network: networkToCaip2("base" /* BASE */),
199
202
  client: new ExactEvmScheme(
200
203
  toClientEvmSigner(
201
204
  wallets.evmAccount.account,
@@ -207,7 +210,7 @@ var safeCreatePaymentPayload = (surface, wallets, paymentRequired, paymentRequir
207
210
  )
208
211
  },
209
212
  {
210
- network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */,
213
+ network: networkToCaip2("solana" /* SOLANA */),
211
214
  client: new PatchedExactSvmScheme(
212
215
  toClientSvmSigner(wallets.svmAccount.account)
213
216
  )
@@ -260,4 +263,4 @@ export {
260
263
  safeGetPaymentSettlement,
261
264
  safeCreateSIWxPayload
262
265
  };
263
- //# sourceMappingURL=chunk-6FEDQ4HI.js.map
266
+ //# sourceMappingURL=chunk-O3TDXKU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/protocols/x402/index.ts","../../src/shared/protocols/x402/patched-exact-svm-scheme.ts"],"sourcesContent":["import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport type { SelectPaymentRequirements } from '@x402/core/client';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { toClientEvmSigner } from '@x402/evm';\nimport { toClientSvmSigner } from '@x402/svm';\n\nimport { ExactEvmScheme } from '@x402/evm/exact/client';\nimport { PatchedExactSvmScheme } from './patched-exact-svm-scheme';\n\nimport { createSIWxPayload } from '@x402/extensions/sign-in-with-x';\n\nimport type { BaseX402Error } from './types';\nimport type { PaymentRequired } from '@x402/core/types';\nimport type {\n CompleteSIWxInfo,\n EVMSigner,\n SolanaSigner,\n} from '@x402/extensions/sign-in-with-x';\nimport type { Wallets } from '@/wallet';\nimport { Network, networkToCaip2 } from '@agentcash/networks';\nimport { createPublicClient, http } from 'viem';\nimport { base } from 'viem/chains';\n\nconst errorType = 'x402';\n\nexport const x402Ok = <T>(value: T) => ok(value);\nexport const x402Err = (cause: string, error: BaseX402Error) =>\n err(errorType, cause, error);\n\nconst x402ResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseX402Error\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst x402ResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseX402Error\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const x402ProbeClient = new x402HTTPClient(new x402Client());\n\nexport const safeGetPaymentRequired = (surface: string, response: Response) => {\n return x402ResultFromPromise(\n surface,\n response.json().then(\n json =>\n x402ProbeClient.getPaymentRequiredResponse(\n name => response.headers.get(name),\n json\n ),\n () =>\n x402ProbeClient.getPaymentRequiredResponse(name =>\n response.headers.get(name)\n )\n ),\n error => ({\n cause: 'parse_payment_required',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse payment required',\n })\n );\n};\n\nexport const safeCreatePaymentPayload = (\n surface: string,\n wallets: Wallets,\n paymentRequired: PaymentRequired,\n paymentRequirementsSelector?: SelectPaymentRequirements\n) => {\n const client = new x402HTTPClient(\n x402Client.fromConfig({\n schemes: [\n {\n network: networkToCaip2(Network.BASE),\n client: new ExactEvmScheme(\n toClientEvmSigner(\n wallets.evmAccount.account,\n createPublicClient({\n chain: base,\n transport: http(),\n })\n )\n ),\n },\n {\n network: networkToCaip2(Network.SOLANA),\n client: new PatchedExactSvmScheme(\n toClientSvmSigner(wallets.svmAccount.account)\n ),\n },\n ],\n paymentRequirementsSelector,\n })\n );\n return x402ResultFromPromise(\n surface,\n client.createPaymentPayload(paymentRequired),\n error => ({\n cause: 'create_payment_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create payment payload',\n })\n );\n};\n\nexport const safeGetPaymentSettlement = (\n surface: string,\n response: Response\n) => {\n return x402ResultFromThrowable(\n surface,\n () =>\n x402ProbeClient.getPaymentSettleResponse(name =>\n response.headers.get(name)\n ),\n error => ({\n cause: 'get_payment_settlement',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to get payment settlement',\n })\n );\n};\n\nexport const safeCreateSIWxPayload = (\n surface: string,\n serverInfo: CompleteSIWxInfo,\n wallets: Wallets\n) => {\n return x402ResultFromPromise(\n surface,\n createSIWxPayload(\n serverInfo,\n serverInfo.chainId.startsWith('eip155:')\n ? (wallets.evmAccount.account as EVMSigner)\n : (wallets.svmAccount.account as unknown as SolanaSigner)\n ),\n error => ({\n cause: 'create_siwx_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create SIWX payload',\n })\n );\n};\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from '@solana-program/compute-budget';\nimport { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from '@solana-program/token-2022';\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from '@solana/kit';\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from '@x402/core/types';\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n createRpcClient,\n type ClientSvmConfig,\n type ClientSvmSigner,\n type ExactSvmPayloadV2,\n} from '@x402/svm';\n\ntype BlockhashLifetime = Parameters<\n typeof setTransactionMessageLifetimeUsingBlockhash\n>[0];\n\ninterface PatchedPaymentExtra {\n feePayer?: Address;\n recentBlockhash?:\n | string\n | Partial<{\n blockhash: string;\n lastValidBlockHeight: bigint | number | string;\n }>;\n lastValidBlockHeight?: bigint | number | string;\n}\n\nfunction parseLastValidBlockHeight(\n value: bigint | number | string | undefined\n): bigint | undefined {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return BigInt(value);\n }\n\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n\n return undefined;\n}\n\nfunction asBlockhash(blockhash: string): BlockhashLifetime['blockhash'] {\n return blockhash as BlockhashLifetime['blockhash'];\n}\n\n/**\n * Local compatibility patch for Coinbase ExactSvmScheme.\n *\n * Changes from upstream:\n * - omits the trailing memo instruction\n * - prefers paymentRequirements.extra.recentBlockhash when provided\n */\nexport class PatchedExactSvmScheme implements SchemeNetworkClient {\n readonly scheme = 'exact';\n\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig\n ) {}\n\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n const rpc = createRpcClient(\n paymentRequirements.network,\n this.config?.rpcUrl\n );\n\n const tokenMint = await fetchMint(\n rpc,\n paymentRequirements.asset as Address\n );\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error('Asset was not created by a known token program');\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: paymentRequirements.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: paymentRequirements.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(paymentRequirements.amount),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress }\n );\n\n const extra = paymentRequirements.extra as PatchedPaymentExtra;\n const feePayer = extra.feePayer;\n\n if (!feePayer) {\n throw new Error(\n 'feePayer is required in paymentRequirements.extra for SVM transactions'\n );\n }\n\n const latestBlockhash = await this.resolveBlockhashLifetime(rpc, extra);\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx =>\n setTransactionMessageComputeUnitPrice(\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n tx\n ),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n }),\n tx\n ),\n tx => appendTransactionMessageInstructions([transferIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx)\n );\n\n const signedTransaction =\n await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction =\n getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV2 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n payload,\n };\n }\n\n private async resolveBlockhashLifetime(\n rpc: ReturnType<typeof createRpcClient>,\n extra: PatchedPaymentExtra\n ): Promise<BlockhashLifetime> {\n const providedLastValidBlockHeight = parseLastValidBlockHeight(\n extra.lastValidBlockHeight\n );\n\n if (typeof extra.recentBlockhash === 'string') {\n if (providedLastValidBlockHeight !== undefined) {\n return {\n blockhash: asBlockhash(extra.recentBlockhash),\n lastValidBlockHeight: providedLastValidBlockHeight,\n };\n }\n\n const { value } = await rpc.getLatestBlockhash().send();\n return {\n blockhash: asBlockhash(extra.recentBlockhash),\n lastValidBlockHeight: value.lastValidBlockHeight,\n };\n }\n\n if (\n extra.recentBlockhash &&\n typeof extra.recentBlockhash === 'object' &&\n typeof extra.recentBlockhash.blockhash === 'string'\n ) {\n const lastValidBlockHeight =\n parseLastValidBlockHeight(extra.recentBlockhash.lastValidBlockHeight) ??\n providedLastValidBlockHeight;\n\n if (lastValidBlockHeight !== undefined) {\n return {\n blockhash: asBlockhash(extra.recentBlockhash.blockhash),\n lastValidBlockHeight,\n };\n }\n\n const { value } = await rpc.getLatestBlockhash().send();\n return {\n blockhash: asBlockhash(extra.recentBlockhash.blockhash),\n lastValidBlockHeight: value.lastValidBlockHeight,\n };\n }\n\n return (await rpc.getLatestBlockhash().send()).value;\n }\n}\n"],"mappings":"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","names":["tx"]}