@vapi-network/core 0.9.0 → 0.9.2

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 (38) hide show
  1. package/dist/api-key.js.map +1 -1
  2. package/dist/backup.js.map +1 -1
  3. package/dist/call-contracts-wire.d.ts +48 -12
  4. package/dist/call-contracts-wire.d.ts.map +1 -1
  5. package/dist/call-contracts.d.ts +7 -1
  6. package/dist/call-contracts.d.ts.map +1 -1
  7. package/dist/cloud-backup.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1000 -957
  11. package/dist/index.js.map +3 -3
  12. package/dist/marketplace-contracts.d.ts +22 -10
  13. package/dist/marketplace-contracts.d.ts.map +1 -1
  14. package/dist/router-client.js +1 -1
  15. package/dist/router-client.js.map +1 -1
  16. package/dist/searches.d.ts +1 -0
  17. package/dist/searches.d.ts.map +1 -1
  18. package/dist/secrets.js.map +1 -1
  19. package/dist/support-report.d.ts +1 -1
  20. package/dist/tasks/chain-error.d.ts.map +1 -1
  21. package/dist/tasks/chain-port.d.ts +2 -0
  22. package/dist/tasks/chain-port.d.ts.map +1 -1
  23. package/dist/tasks/chain.d.ts.map +1 -1
  24. package/dist/tasks/client.d.ts.map +1 -1
  25. package/dist/tasks/index.d.ts +1 -0
  26. package/dist/tasks/index.d.ts.map +1 -1
  27. package/dist/tasks/operation-support.d.ts.map +1 -1
  28. package/dist/tasks/operations.d.ts +56 -1
  29. package/dist/tasks/operations.d.ts.map +1 -1
  30. package/dist/tasks/types.d.ts +5 -5
  31. package/dist/tasks/types.d.ts.map +1 -1
  32. package/dist/tasks/wait.d.ts +18 -0
  33. package/dist/tasks/wait.d.ts.map +1 -0
  34. package/dist/tasks.js +247 -45
  35. package/dist/tasks.js.map +3 -3
  36. package/dist/x402-networks.d.ts +1 -0
  37. package/dist/x402-networks.d.ts.map +1 -1
  38. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -28912,378 +28912,6 @@ function date4(params) {
28912
28912
  return _coercedDate(ZodDate, params);
28913
28913
  }
28914
28914
 
28915
- // src/marketplace-contracts.ts
28916
- var MARKETPLACE_DISCOVERY_PROTOCOL = "vapi.marketplace.discovery/1";
28917
- var MARKETPLACE_RANKING_VERSION = "marketplace-ranking-v1";
28918
- var MARKETPLACE_KINDS = ["api", "service_offer", "open_request"];
28919
- var MARKETPLACE_EXECUTION_METHODS = [
28920
- "GET",
28921
- "HEAD",
28922
- "POST",
28923
- "PUT",
28924
- "PATCH",
28925
- "DELETE"
28926
- ];
28927
- var marketplaceExecutionMethodSchema = external_exports.enum(MARKETPLACE_EXECUTION_METHODS);
28928
- var marketplaceKindSchema = external_exports.enum(MARKETPLACE_KINDS);
28929
- var EXECUTION_MODES = ["direct", "gateway"];
28930
- var executionModeSchema = external_exports.enum(EXECUTION_MODES);
28931
- var PROVENANCES = ["indexed", "self_listed", "partner"];
28932
- var provenanceSchema = external_exports.enum(PROVENANCES);
28933
- var FIRST_PARTY_PROVENANCES = ["self_listed", "partner"];
28934
- var firstPartyProvenanceSchema = external_exports.enum(FIRST_PARTY_PROVENANCES);
28935
- var LISTING_GROUPS = ["vapi", "added", "partner", "external"];
28936
- var listingGroupSchema = external_exports.enum(LISTING_GROUPS);
28937
- var listingFeeSchema = external_exports.looseObject({
28938
- bps: external_exports.number().int().min(0),
28939
- label: external_exports.string()
28940
- });
28941
- var LISTING_VERIFICATIONS = ["none", "requested", "verified"];
28942
- var listingVerificationSchema = external_exports.enum(LISTING_VERIFICATIONS);
28943
- var listingVerificationFieldSchema = listingVerificationSchema.default("none").catch("none");
28944
- var listingLivenessSchema = external_exports.looseObject({
28945
- uptime7d: external_exports.number().min(0).max(1),
28946
- latencyP50Ms: external_exports.number().nonnegative().nullable(),
28947
- latencyP95Ms: external_exports.number().nonnegative().nullable(),
28948
- checks7d: external_exports.number().int().nonnegative()
28949
- });
28950
- var listingConformanceSchema = external_exports.looseObject({
28951
- declaredVersion: external_exports.union([external_exports.literal(1), external_exports.literal(2)]).nullable(),
28952
- versionConformant: external_exports.boolean(),
28953
- offerTransport: external_exports.enum(["body", "header", "both"]),
28954
- issues: external_exports.array(external_exports.string())
28955
- });
28956
- var listingIdentitySchema = external_exports.looseObject({
28957
- erc8004Id: external_exports.string().trim().min(1),
28958
- reputation: external_exports.looseObject({
28959
- score: external_exports.number().finite(),
28960
- count: external_exports.number().int().nonnegative()
28961
- }).optional().catch(void 0)
28962
- });
28963
- var listingDisclosureShape = {
28964
- group: listingGroupSchema.optional(),
28965
- fee: listingFeeSchema.optional(),
28966
- verification: listingVerificationFieldSchema,
28967
- liveness: listingLivenessSchema.optional().catch(void 0),
28968
- conformance: listingConformanceSchema.optional().catch(void 0),
28969
- identity: listingIdentitySchema.optional().catch(void 0)
28970
- };
28971
- var marketplaceBadgeCodeSchema = external_exports.enum([
28972
- "live_x402",
28973
- "partner",
28974
- "payout_wallet_confirmed",
28975
- "vapi_verified",
28976
- "external_catalog",
28977
- "approved_vendor"
28978
- ]);
28979
- var marketplaceBadgeSchema = external_exports.looseObject({
28980
- code: marketplaceBadgeCodeSchema,
28981
- label: external_exports.string().trim().min(1).max(80)
28982
- });
28983
- var marketplacePublicFactSchema = external_exports.looseObject({
28984
- label: external_exports.string().trim().min(1).max(80),
28985
- value: external_exports.string().trim().min(1).max(160)
28986
- });
28987
- var marketplaceHrefSchema = external_exports.union([
28988
- external_exports.string().trim().min(1).max(2048).regex(/^\/(?!\/)/),
28989
- external_exports.url().max(2048).regex(/^https:\/\//)
28990
- ]);
28991
- var marketplaceCardSchema = external_exports.looseObject({
28992
- title: external_exports.string().trim().min(1).max(160),
28993
- summary: external_exports.string().trim().min(1).max(1e3),
28994
- byline: external_exports.string().trim().min(1).max(160).optional(),
28995
- bylineHref: marketplaceHrefSchema.optional(),
28996
- badges: external_exports.array(marketplaceBadgeSchema).max(8),
28997
- facts: external_exports.array(marketplacePublicFactSchema).max(12)
28998
- });
28999
- var marketplaceHitBase = {
29000
- ref: external_exports.string().trim().min(1).max(512),
29001
- card: marketplaceCardSchema,
29002
- ...listingDisclosureShape
29003
- };
29004
- var invokeApiActionSchema = external_exports.looseObject({
29005
- type: external_exports.literal("invoke_api"),
29006
- href: marketplaceHrefSchema
29007
- });
29008
- var firstPartyApiMarketplaceHitSchema = external_exports.looseObject({
29009
- ...marketplaceHitBase,
29010
- kind: external_exports.literal("api"),
29011
- provenance: firstPartyProvenanceSchema,
29012
- execution: external_exports.looseObject({
29013
- mode: executionModeSchema
29014
- }),
29015
- action: invokeApiActionSchema
29016
- });
29017
- var mirroredApiMarketplaceHitSchema = external_exports.looseObject({
29018
- ...marketplaceHitBase,
29019
- kind: external_exports.literal("api"),
29020
- provenance: external_exports.literal("indexed"),
29021
- execution: external_exports.looseObject({
29022
- mode: external_exports.literal("direct"),
29023
- url: external_exports.url().max(2048).regex(/^https:\/\/(?![^/?#]*@)/),
29024
- method: marketplaceExecutionMethodSchema.nullable(),
29025
- network: external_exports.string().trim().max(160).regex(/^eip155:[1-9]\d*$/)
29026
- }),
29027
- action: invokeApiActionSchema
29028
- });
29029
- var apiMarketplaceHitSchema = external_exports.discriminatedUnion("provenance", [
29030
- firstPartyApiMarketplaceHitSchema,
29031
- mirroredApiMarketplaceHitSchema
29032
- ]);
29033
- var serviceOfferMarketplaceHitSchema = external_exports.looseObject({
29034
- ...marketplaceHitBase,
29035
- kind: external_exports.literal("service_offer"),
29036
- action: external_exports.looseObject({
29037
- type: external_exports.literal("start_engagement"),
29038
- href: marketplaceHrefSchema
29039
- })
29040
- });
29041
- var openRequestMarketplaceHitSchema = external_exports.looseObject({
29042
- ...marketplaceHitBase,
29043
- kind: external_exports.literal("open_request"),
29044
- action: external_exports.looseObject({
29045
- type: external_exports.literal("propose_to_request"),
29046
- href: marketplaceHrefSchema
29047
- })
29048
- });
29049
- var marketplaceHitSchema = external_exports.union([
29050
- apiMarketplaceHitSchema,
29051
- serviceOfferMarketplaceHitSchema,
29052
- openRequestMarketplaceHitSchema
29053
- ]);
29054
- var marketplaceDiscoveryInputSchema = external_exports.strictObject({
29055
- q: external_exports.string().trim().max(200).optional(),
29056
- kinds: external_exports.array(marketplaceKindSchema).min(1).max(MARKETPLACE_KINDS.length).optional(),
29057
- network: external_exports.string().trim().min(1).max(160).optional(),
29058
- cursor: external_exports.string().trim().min(1).max(4096).optional(),
29059
- limit: external_exports.number().int().min(1).max(50).optional(),
29060
- includeUnverified: external_exports.boolean().optional()
29061
- }).superRefine((input2, context) => {
29062
- if (input2.kinds && new Set(input2.kinds).size !== input2.kinds.length) {
29063
- context.addIssue({
29064
- code: "custom",
29065
- path: ["kinds"],
29066
- message: "Marketplace kinds must be unique"
29067
- });
29068
- }
29069
- });
29070
- function isMirroredHit(hit) {
29071
- return hit.kind === "api" && hit.provenance === "indexed";
29072
- }
29073
- var marketplaceDiscoveryPageSchema = external_exports.looseObject({
29074
- protocol: external_exports.literal(MARKETPLACE_DISCOVERY_PROTOCOL),
29075
- items: external_exports.array(marketplaceHitSchema),
29076
- nextCursor: external_exports.string().min(1).max(4096).nullable(),
29077
- unavailableKinds: external_exports.array(marketplaceKindSchema).max(MARKETPLACE_KINDS.length),
29078
- rankingVersion: external_exports.literal(MARKETPLACE_RANKING_VERSION)
29079
- });
29080
-
29081
- // src/call-contracts-wire.ts
29082
- var CALLABLE_KIND = "agent";
29083
- var CALLABLE_CATEGORIES = ["ai", "data", "crypto", "compute", "search"];
29084
- var callableCategorySchema = external_exports.enum(CALLABLE_CATEGORIES);
29085
- var DISCOVERY_CATEGORIES = [...CALLABLE_CATEGORIES, "other"];
29086
- var discoveryCategorySchema = external_exports.enum(DISCOVERY_CATEGORIES);
29087
- var CALLABLE_CATEGORY_LABELS = {
29088
- ai: { catalog: "AI / LLM", publish: "AI and models" },
29089
- data: { catalog: "Data", publish: "Data" },
29090
- crypto: { catalog: "Crypto", publish: "Crypto" },
29091
- compute: { catalog: "Compute", publish: "Compute" },
29092
- search: { catalog: "Search", publish: "Search" }
29093
- };
29094
- var CALLABLE_CATEGORY_SET = new Set(CALLABLE_CATEGORIES);
29095
- function isCallableListing(kind, category) {
29096
- return kind === CALLABLE_KIND && CALLABLE_CATEGORY_SET.has(category);
29097
- }
29098
- var serviceTierSchema = external_exports.enum(["listed", "verified", "partner"]);
29099
- var discoveryEndpointSchema = external_exports.looseObject({
29100
- name: external_exports.string(),
29101
- method: external_exports.string(),
29102
- url: external_exports.url(),
29103
- price: external_exports.string(),
29104
- description: external_exports.string(),
29105
- operationId: external_exports.string().trim().min(1).optional(),
29106
- requestContentType: external_exports.string().trim().min(1).optional(),
29107
- requestSchema: external_exports.json().optional(),
29108
- responseContentType: external_exports.string().trim().min(1).optional(),
29109
- pathTemplate: external_exports.string().trim().min(1).optional(),
29110
- pathParameters: external_exports.array(external_exports.string().trim().min(1)).optional(),
29111
- payment: external_exports.looseObject({
29112
- scheme: external_exports.literal("exact"),
29113
- network: external_exports.string().regex(/^eip155:\d+$/),
29114
- asset: external_exports.string().regex(/^0x[0-9a-fA-F]{40}$/),
29115
- payTo: external_exports.string().regex(/^0x[0-9a-fA-F]{40}$/),
29116
- checkedAt: external_exports.iso.datetime()
29117
- }).optional()
29118
- });
29119
- var serviceSummarySchema = external_exports.looseObject({
29120
- id: external_exports.string(),
29121
- name: external_exports.string(),
29122
- description: external_exports.string(),
29123
- category: discoveryCategorySchema,
29124
- tier: serviceTierSchema,
29125
- ...listingDisclosureShape,
29126
- verified: external_exports.boolean(),
29127
- wrapped: external_exports.boolean(),
29128
- price: external_exports.string(),
29129
- networks: external_exports.array(external_exports.string()),
29130
- endpoints: external_exports.array(discoveryEndpointSchema)
29131
- });
29132
- var searchServicesResponseSchema = external_exports.looseObject({
29133
- services: external_exports.array(serviceSummarySchema)
29134
- });
29135
- var listServicesResponseSchema = searchServicesResponseSchema;
29136
- var discoveryServiceSchema = serviceSummarySchema;
29137
- var discoveryResponseSchema = searchServicesResponseSchema;
29138
-
29139
- // src/call-contracts.ts
29140
- var DiscoveryCatalogError = class extends Error {
29141
- name = "DiscoveryCatalogError";
29142
- code;
29143
- serviceId;
29144
- constructor(code, message, serviceId) {
29145
- super(message);
29146
- this.code = code;
29147
- this.serviceId = serviceId;
29148
- }
29149
- };
29150
- function parseDiscovery(raw) {
29151
- const parsed = discoveryResponseSchema.safeParse(raw);
29152
- if (!parsed.success) {
29153
- const malformedUrl = parsed.error.issues.find(
29154
- (issue2) => issue2.path.at(-1) === "url" && issue2.path.includes("endpoints")
29155
- );
29156
- if (malformedUrl) {
29157
- const serviceIndex = pathIndexAfter(malformedUrl.path, "services");
29158
- const serviceId = rawServiceId(raw, serviceIndex);
29159
- throw new DiscoveryCatalogError(
29160
- "malformed_url",
29161
- `Service ${JSON.stringify(serviceId ?? "unknown")} has a malformed endpoint URL.`,
29162
- serviceId
29163
- );
29164
- }
29165
- throw new DiscoveryCatalogError("invalid_discovery", "Discovery response is malformed.");
29166
- }
29167
- for (const service of parsed.data.services) {
29168
- buildTargets(service);
29169
- }
29170
- const resolveListing = (serviceId, endpointName) => {
29171
- const service = parsed.data.services.find((candidate) => candidate.id === serviceId);
29172
- if (!service) {
29173
- throw new DiscoveryCatalogError(
29174
- "service_not_found",
29175
- `No payable endpoint found for service ${JSON.stringify(serviceId)}.`,
29176
- serviceId
29177
- );
29178
- }
29179
- return { service, endpoint: resolveTarget(service, endpointName) };
29180
- };
29181
- return {
29182
- services: parsed.data.services,
29183
- resolve: (serviceId, endpointName) => resolveListing(serviceId, endpointName).endpoint,
29184
- resolveListing
29185
- };
29186
- }
29187
- function resolveTarget(service, endpointName) {
29188
- const { targets, targetsByName } = buildTargets(service);
29189
- if (endpointName !== void 0) {
29190
- const selected = targetsByName.get(endpointName.trim());
29191
- if (!selected) {
29192
- throw new DiscoveryCatalogError(
29193
- "endpoint_not_found",
29194
- `Service ${JSON.stringify(service.id)} has no endpoint ${JSON.stringify(endpointName)}. Available endpoints: ${[...targetsByName.keys()].join(", ")}.`,
29195
- service.id
29196
- );
29197
- }
29198
- return { ...selected };
29199
- }
29200
- if (targets.size !== 1) {
29201
- throw new DiscoveryCatalogError(
29202
- "ambiguous_default",
29203
- `Service ${JSON.stringify(service.id)} has ${targets.size} distinct payable endpoints. Choose one with endpoint: ${[...targetsByName.keys()].join(", ")}.`,
29204
- service.id
29205
- );
29206
- }
29207
- return targets.values().next().value;
29208
- }
29209
- function buildTargets(service) {
29210
- if (service.endpoints.length === 0) {
29211
- throw new DiscoveryCatalogError(
29212
- "no_endpoint",
29213
- `Service ${JSON.stringify(service.id)} has no payable endpoint.`,
29214
- service.id
29215
- );
29216
- }
29217
- const namedEndpoints = [...service.endpoints].sort(
29218
- (left, right) => compareNames(left.name.trim(), right.name.trim())
29219
- );
29220
- const names = /* @__PURE__ */ new Set();
29221
- const targets = /* @__PURE__ */ new Map();
29222
- const targetsByName = /* @__PURE__ */ new Map();
29223
- for (const endpoint of namedEndpoints) {
29224
- const name = endpoint.name.trim();
29225
- if (!name) {
29226
- throw new DiscoveryCatalogError(
29227
- "invalid_endpoint_name",
29228
- `Service ${JSON.stringify(service.id)} has a blank endpoint name.`,
29229
- service.id
29230
- );
29231
- }
29232
- if (names.has(name)) {
29233
- throw new DiscoveryCatalogError(
29234
- "duplicate_endpoint_name",
29235
- `Service ${JSON.stringify(service.id)} has duplicate endpoint name ${JSON.stringify(name)}.`,
29236
- service.id
29237
- );
29238
- }
29239
- names.add(name);
29240
- const method = endpoint.method.trim().toUpperCase();
29241
- if (!method) {
29242
- throw new DiscoveryCatalogError(
29243
- "blank_method",
29244
- `Service ${JSON.stringify(service.id)} has a blank endpoint method.`,
29245
- service.id
29246
- );
29247
- }
29248
- const url2 = new URL(endpoint.url);
29249
- if (url2.protocol !== "http:" && url2.protocol !== "https:") {
29250
- throw new DiscoveryCatalogError(
29251
- "malformed_url",
29252
- `Service ${JSON.stringify(service.id)} has a non-HTTP endpoint URL.`,
29253
- service.id
29254
- );
29255
- }
29256
- const transportKey = `${method}\0${endpoint.url}`;
29257
- const normalized = { ...endpoint, name, method };
29258
- targetsByName.set(name, normalized);
29259
- if (!targets.has(transportKey)) targets.set(transportKey, normalized);
29260
- }
29261
- return { targets, targetsByName };
29262
- }
29263
- function compareNames(left, right) {
29264
- return left < right ? -1 : left > right ? 1 : 0;
29265
- }
29266
- function pathIndexAfter(path, key) {
29267
- const keyIndex = path.indexOf(key);
29268
- const candidate = path[keyIndex + 1];
29269
- return typeof candidate === "number" ? candidate : void 0;
29270
- }
29271
- function rawServiceId(raw, serviceIndex) {
29272
- if (serviceIndex === void 0 || typeof raw !== "object" || raw === null) {
29273
- return void 0;
29274
- }
29275
- const services = Reflect.get(raw, "services");
29276
- if (!Array.isArray(services)) {
29277
- return void 0;
29278
- }
29279
- const service = services[serviceIndex];
29280
- if (typeof service !== "object" || service === null) {
29281
- return void 0;
29282
- }
29283
- const id = Reflect.get(service, "id");
29284
- return typeof id === "string" ? id : void 0;
29285
- }
29286
-
29287
28915
  // ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/getAction.js
29288
28916
  function getAction(client, actionFn, name) {
29289
28917
  const action_implicit = client[actionFn.name];
@@ -39084,6 +38712,7 @@ var ARC_MAINNET_CAIP2 = "eip155:5042";
39084
38712
  var ARC_TESTNET_CAIP2 = "eip155:5042002";
39085
38713
  var SOLANA_MAINNET_CAIP2 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
39086
38714
  var X402_SOLANA_MAINNET_CAIP2 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
38715
+ var SOLANA_DEVNET_CAIP2 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
39087
38716
  var SOLANA_MAINNET_USDC = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
39088
38717
  function canonicalIdentity(usdc, eip712Domain) {
39089
38718
  return Object.freeze({
@@ -39127,375 +38756,184 @@ var BROWSER_ENABLED_X402_NETWORK_CONFIG = Object.freeze({
39127
38756
  [ARC_TESTNET_CAIP2]: browserNetwork(arcTestnetUsdc)
39128
38757
  });
39129
38758
 
39130
- // src/net-guard.ts
39131
- import { lookup as dnsLookup } from "node:dns/promises";
39132
- import { request as httpRequest } from "node:http";
39133
- import { request as httpsRequest } from "node:https";
39134
- import { isIP } from "node:net";
39135
- import { Readable } from "node:stream";
39136
- var defaultLookup = async (hostname3) => {
39137
- const addresses = await dnsLookup(hostname3, { all: true });
39138
- return addresses.map(({ address: address2 }) => address2);
38759
+ // src/marketplace-contracts.ts
38760
+ var MARKETPLACE_DISCOVERY_PROTOCOL = "vapi.marketplace.discovery/1";
38761
+ var MARKETPLACE_RANKING_VERSION = "marketplace-ranking-v1";
38762
+ var MARKETPLACE_KINDS = ["api", "service_offer", "open_request"];
38763
+ var MARKETPLACE_EXECUTION_METHODS = [
38764
+ "GET",
38765
+ "HEAD",
38766
+ "POST",
38767
+ "PUT",
38768
+ "PATCH",
38769
+ "DELETE"
38770
+ ];
38771
+ var marketplaceExecutionMethodSchema = external_exports.enum(MARKETPLACE_EXECUTION_METHODS);
38772
+ var marketplaceKindSchema = external_exports.enum(MARKETPLACE_KINDS);
38773
+ var EXECUTION_MODES = ["direct", "gateway"];
38774
+ var executionModeSchema = external_exports.enum(EXECUTION_MODES);
38775
+ var PROVENANCES = ["indexed", "self_listed", "partner"];
38776
+ var provenanceSchema = external_exports.enum(PROVENANCES);
38777
+ var FIRST_PARTY_PROVENANCES = ["self_listed", "partner"];
38778
+ var firstPartyProvenanceSchema = external_exports.enum(FIRST_PARTY_PROVENANCES);
38779
+ var LISTING_GROUPS = ["vapi", "added", "partner", "external"];
38780
+ var listingGroupSchema = external_exports.enum(LISTING_GROUPS);
38781
+ var listingFeeSchema = external_exports.looseObject({
38782
+ bps: external_exports.number().int().min(0),
38783
+ label: external_exports.string()
38784
+ });
38785
+ var LISTING_VERIFICATIONS = ["none", "requested", "verified"];
38786
+ var listingVerificationSchema = external_exports.enum(LISTING_VERIFICATIONS);
38787
+ var listingVerificationFieldSchema = listingVerificationSchema.default("none").catch("none");
38788
+ var listingLivenessSchema = external_exports.looseObject({
38789
+ uptime7d: external_exports.number().min(0).max(1),
38790
+ latencyP50Ms: external_exports.number().nonnegative().nullable(),
38791
+ latencyP95Ms: external_exports.number().nonnegative().nullable(),
38792
+ checks7d: external_exports.number().int().nonnegative()
38793
+ });
38794
+ var listingConformanceSchema = external_exports.looseObject({
38795
+ declaredVersion: external_exports.union([external_exports.literal(1), external_exports.literal(2)]).nullable(),
38796
+ versionConformant: external_exports.boolean(),
38797
+ offerTransport: external_exports.enum(["body", "header", "both"]),
38798
+ issues: external_exports.array(external_exports.string())
38799
+ });
38800
+ var listingIdentitySchema = external_exports.looseObject({
38801
+ erc8004Id: external_exports.string().trim().min(1),
38802
+ reputation: external_exports.looseObject({
38803
+ score: external_exports.number().finite(),
38804
+ count: external_exports.number().int().nonnegative()
38805
+ }).optional().catch(void 0)
38806
+ });
38807
+ var listingDisclosureShape = {
38808
+ group: listingGroupSchema.optional(),
38809
+ fee: listingFeeSchema.optional(),
38810
+ verification: listingVerificationFieldSchema,
38811
+ liveness: listingLivenessSchema.optional().catch(void 0),
38812
+ conformance: listingConformanceSchema.optional().catch(void 0),
38813
+ identity: listingIdentitySchema.optional().catch(void 0)
39139
38814
  };
39140
- async function assertPublicUrl(url2, options) {
39141
- if (url2.username || url2.password) {
39142
- throw guardError(url2);
39143
- }
39144
- if (url2.protocol !== "http:" && url2.protocol !== "https:") {
39145
- throw guardError(url2);
39146
- }
39147
- if (options.allowPrivateNetwork) {
39148
- return;
39149
- }
39150
- const hostname3 = normalizeHostname(url2.hostname);
39151
- const lowercaseHostname = hostname3.toLowerCase();
39152
- if (!lowercaseHostname || lowercaseHostname === "localhost" || lowercaseHostname.endsWith(".localhost") || lowercaseHostname.endsWith(".local") || lowercaseHostname.endsWith(".internal")) {
39153
- throw guardError(url2);
39154
- }
39155
- if (isIP(hostname3)) {
39156
- if (isNonPublicAddress(hostname3)) {
39157
- throw guardError(url2);
39158
- }
39159
- return;
39160
- }
39161
- let addresses;
39162
- try {
39163
- addresses = await withTimeout2(
39164
- (options.lookup ?? defaultLookup)(hostname3),
39165
- options.timeoutMs ?? 5e3
39166
- );
39167
- } catch {
39168
- throw guardError(url2);
39169
- }
39170
- if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
39171
- throw guardError(url2);
39172
- }
39173
- }
39174
- function createPublicFetch(options) {
39175
- const lookupFn = options.lookup ?? defaultLookup;
39176
- return (async (input2, init) => {
39177
- const url2 = new URL(input2 instanceof Request ? input2.url : input2);
39178
- await assertPublicUrl(url2, {
39179
- allowPrivateNetwork: options.allowPrivateNetwork,
39180
- lookup: lookupFn,
39181
- timeoutMs: 5e3
39182
- });
39183
- const normalized = new Request(input2, init);
39184
- const bytes = normalized.body ? Buffer.from(await normalized.arrayBuffer()) : null;
39185
- return await new Promise((resolve2, reject) => {
39186
- const requestOptions = {
39187
- method: normalized.method,
39188
- headers: Object.fromEntries(normalized.headers),
39189
- signal: normalized.signal,
39190
- ...options.allowPrivateNetwork ? {} : { lookup: pinnedLookup(lookupFn) }
39191
- };
39192
- const onResponse = (incoming) => {
39193
- try {
39194
- const headers = new Headers();
39195
- for (const [name, value] of Object.entries(incoming.headers)) {
39196
- if (Array.isArray(value)) {
39197
- for (const item of value) headers.append(name, item);
39198
- } else if (value !== void 0) {
39199
- headers.set(name, value);
39200
- }
39201
- }
39202
- const status = incoming.statusCode ?? 500;
39203
- const bodyForbidden = normalized.method === "HEAD" || [204, 205, 304].includes(status);
39204
- if (bodyForbidden) incoming.resume();
39205
- const response = new Response(
39206
- bodyForbidden ? null : Readable.toWeb(incoming),
39207
- { status, statusText: incoming.statusMessage, headers }
39208
- );
39209
- Object.defineProperty(response, "url", { value: url2.toString() });
39210
- resolve2(response);
39211
- } catch (error61) {
39212
- incoming.destroy();
39213
- reject(error61);
39214
- }
39215
- };
39216
- const request = url2.protocol === "https:" ? httpsRequest(url2, requestOptions, onResponse) : httpRequest(url2, requestOptions, onResponse);
39217
- request.on("error", reject);
39218
- if (bytes) request.write(bytes);
39219
- request.end();
39220
- });
39221
- });
39222
- }
39223
- function pinnedLookup(lookup) {
39224
- return (hostname3, dnsOptions, callback) => {
39225
- void lookup(normalizeHostname(hostname3)).then((addresses) => {
39226
- if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
39227
- callback(guardError(new URL(`https://${hostname3}`)), "");
39228
- return;
39229
- }
39230
- const address2 = addresses[0];
39231
- const family = isIP(address2);
39232
- callback(
39233
- null,
39234
- dnsOptions.all ? [{ address: address2, family }] : address2,
39235
- dnsOptions.all ? void 0 : family
39236
- );
39237
- }).catch(
39238
- (error61) => callback(error61 instanceof Error ? error61 : new Error("DNS lookup failed."), "")
39239
- );
39240
- };
39241
- }
39242
- async function withTimeout2(operation, timeoutMs) {
39243
- let timeout;
39244
- try {
39245
- return await Promise.race([
39246
- operation,
39247
- new Promise((_resolve, reject) => {
39248
- timeout = setTimeout(() => reject(new Error("DNS lookup timed out.")), timeoutMs);
39249
- })
39250
- ]);
39251
- } finally {
39252
- if (timeout) clearTimeout(timeout);
39253
- }
39254
- }
39255
- function normalizeHostname(hostname3) {
39256
- const unbracketed = hostname3.startsWith("[") && hostname3.endsWith("]") ? hostname3.slice(1, -1) : hostname3;
39257
- return unbracketed.endsWith(".") ? unbracketed.slice(0, -1) : unbracketed;
39258
- }
39259
- function isNonPublicAddress(address2) {
39260
- const normalized = normalizeHostname(address2);
39261
- const version5 = isIP(normalized);
39262
- if (version5 === 4) {
39263
- return isNonPublicIpv4(parseIpv4(normalized));
39264
- }
39265
- if (version5 === 6) {
39266
- return isNonPublicIpv6(parseIpv6(normalized));
39267
- }
39268
- return true;
39269
- }
39270
- function parseIpv4(address2) {
39271
- const octets = address2.split(".").map(Number);
39272
- return [octets[0], octets[1], octets[2], octets[3]];
39273
- }
39274
- function isNonPublicIpv4([first, second, third]) {
39275
- return first === 0 || first === 10 || first === 100 && second >= 64 && second <= 127 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 0 && (third === 0 || third === 2) || first === 192 && second === 168 || first === 198 && second >= 18 && second <= 19 || first === 198 && second === 51 && third === 100 || first === 203 && second === 0 && third === 113 || first >= 224;
39276
- }
39277
- function parseIpv6(address2) {
39278
- let normalized = address2.toLowerCase();
39279
- const lastColon = normalized.lastIndexOf(":");
39280
- const dottedTail = normalized.slice(lastColon + 1);
39281
- if (dottedTail.includes(".")) {
39282
- const [first, second, third, fourth] = parseIpv4(dottedTail);
39283
- normalized = `${normalized.slice(0, lastColon + 1)}${(first << 8 | second).toString(16)}:${(third << 8 | fourth).toString(16)}`;
39284
- }
39285
- const halves = normalized.split("::");
39286
- const left = halves[0] ? halves[0].split(":").map(parseHex) : [];
39287
- const right = halves[1] ? halves[1].split(":").map(parseHex) : [];
39288
- const omittedCount = 8 - left.length - right.length;
39289
- return halves.length === 2 ? [...left, ...Array.from({ length: omittedCount }, () => 0), ...right] : left;
39290
- }
39291
- function parseHex(value) {
39292
- return Number.parseInt(value, 16);
39293
- }
39294
- function isNonPublicIpv6(hextets) {
39295
- if (hextets.slice(0, 5).every((hextet) => hextet === 0) && hextets[5] === 65535) {
39296
- const embeddedIpv4 = [
39297
- hextets[6] >> 8,
39298
- hextets[6] & 255,
39299
- hextets[7] >> 8,
39300
- hextets[7] & 255
39301
- ];
39302
- return isNonPublicIpv4(embeddedIpv4);
39303
- }
39304
- if (hextets.slice(0, 6).every((hextet) => hextet === 0)) {
39305
- const compatibleIpv4 = [
39306
- hextets[6] >> 8,
39307
- hextets[6] & 255,
39308
- hextets[7] >> 8,
39309
- hextets[7] & 255
39310
- ];
39311
- if (isNonPublicIpv4(compatibleIpv4)) return true;
39312
- }
39313
- const isUnspecified = hextets.every((hextet) => hextet === 0);
39314
- const isLoopback = hextets.slice(0, 7).every((hextet) => hextet === 0) && hextets[7] === 1;
39315
- const first = hextets[0];
39316
- const isUniqueLocal = first >= 64512 && first <= 65023;
39317
- const isLinkLocal = first >= 65152 && first <= 65215;
39318
- const isSiteLocal = first >= 65216 && first <= 65279;
39319
- const isMulticast = first >= 65280;
39320
- const isDocumentation = first === 8193 && hextets[1] === 3512;
39321
- return isUnspecified || isLoopback || isUniqueLocal || isLinkLocal || isSiteLocal || isMulticast || isDocumentation;
39322
- }
39323
- function guardError(url2) {
39324
- return new Error(
39325
- `URL hostname ${JSON.stringify(url2.hostname)} is not allowed; private or internal destinations require allowPrivateNetwork true in the vAPI config.`
39326
- );
39327
- }
39328
-
39329
- // src/networks.ts
39330
- var USDC_DECIMALS = 6;
39331
- var DEFAULT_ARC_GAS_HEADROOM_ATOMIC = 50000n;
39332
- var NETWORKS = {
39333
- [BASE_MAINNET_CAIP2]: {
39334
- family: "evm",
39335
- chainId: 8453,
39336
- name: "Base mainnet",
39337
- usdc: CANONICAL_X402_USDC_NETWORKS[BASE_MAINNET_CAIP2].usdc,
39338
- gasToken: "ETH",
39339
- rpcEnv: "BASE_RPC_URL",
39340
- publicRpcUrl: "https://mainnet.base.org",
39341
- explorerUrl: "https://basescan.org"
39342
- },
39343
- [ARC_MAINNET_CAIP2]: {
39344
- family: "evm",
39345
- chainId: 5042,
39346
- name: "Arc mainnet",
39347
- usdc: CANONICAL_X402_USDC_NETWORKS[ARC_MAINNET_CAIP2].usdc,
39348
- gasToken: "USDC",
39349
- rpcEnv: "ARC_RPC_URL",
39350
- publicRpcUrl: "https://rpc.mainnet.arc.io",
39351
- explorerUrl: "https://explorer.arc.io"
39352
- },
39353
- [ARC_TESTNET_CAIP2]: {
39354
- family: "evm",
39355
- chainId: 5042002,
39356
- name: "Arc testnet",
39357
- usdc: CANONICAL_X402_USDC_NETWORKS[ARC_TESTNET_CAIP2].usdc,
39358
- gasToken: "USDC",
39359
- rpcEnv: "ARC_TESTNET_RPC_URL"
39360
- },
39361
- [SOLANA_MAINNET_CAIP2]: {
39362
- family: "svm",
39363
- name: "Solana mainnet",
39364
- usdc: SOLANA_MAINNET_USDC,
39365
- gasToken: "SOL",
39366
- rpcEnv: "SOLANA_RPC_URL",
39367
- publicRpcUrl: "https://api.mainnet-beta.solana.com"
39368
- },
39369
- [X402_SOLANA_MAINNET_CAIP2]: {
39370
- family: "svm",
39371
- name: "Solana mainnet",
39372
- usdc: SOLANA_MAINNET_USDC,
39373
- gasToken: "SOL",
39374
- rpcEnv: "SOLANA_RPC_URL",
39375
- publicRpcUrl: "https://api.mainnet-beta.solana.com"
39376
- }
38815
+ var marketplaceBadgeCodeSchema = external_exports.enum([
38816
+ "live_x402",
38817
+ "partner",
38818
+ "payout_wallet_confirmed",
38819
+ "vapi_verified",
38820
+ "external_catalog",
38821
+ "approved_vendor"
38822
+ ]);
38823
+ var marketplaceBadgeSchema = external_exports.looseObject({
38824
+ code: marketplaceBadgeCodeSchema,
38825
+ label: external_exports.string().trim().min(1).max(80)
38826
+ });
38827
+ var marketplacePublicFactSchema = external_exports.looseObject({
38828
+ label: external_exports.string().trim().min(1).max(80),
38829
+ value: external_exports.string().trim().min(1).max(160)
38830
+ });
38831
+ var marketplaceHrefSchema = external_exports.union([
38832
+ external_exports.string().trim().min(1).max(2048).regex(/^\/(?!\/)/),
38833
+ external_exports.url().max(2048).regex(/^https:\/\//)
38834
+ ]);
38835
+ var marketplaceCardSchema = external_exports.looseObject({
38836
+ title: external_exports.string().trim().min(1).max(160),
38837
+ summary: external_exports.string().trim().min(1).max(1e3),
38838
+ byline: external_exports.string().trim().min(1).max(160).optional(),
38839
+ bylineHref: marketplaceHrefSchema.optional(),
38840
+ badges: external_exports.array(marketplaceBadgeSchema).max(8),
38841
+ facts: external_exports.array(marketplacePublicFactSchema).max(12)
38842
+ });
38843
+ var marketplaceHitBase = {
38844
+ ref: external_exports.string().trim().min(1).max(512),
38845
+ card: marketplaceCardSchema,
38846
+ ...listingDisclosureShape
39377
38847
  };
39378
- function parseEip155ChainId(network) {
39379
- const match = /^eip155:(\d+)$/.exec(network);
39380
- if (!match) {
39381
- throw new Error(`Unsupported network ${network}; expected eip155:<chainId>.`);
39382
- }
39383
- const chainId = Number(match[1]);
39384
- if (!Number.isSafeInteger(chainId) || chainId <= 0) {
39385
- throw new Error(`Invalid EVM chain ID in network ${network}.`);
39386
- }
39387
- return chainId;
39388
- }
39389
- function isSolanaNetwork(network) {
39390
- return network === SOLANA_MAINNET_CAIP2 || network === X402_SOLANA_MAINNET_CAIP2;
39391
- }
39392
- function usesUsdcGas(network) {
39393
- try {
39394
- return getNetworkDefinition(network).gasToken === "USDC";
39395
- } catch {
39396
- return false;
39397
- }
39398
- }
39399
- function explorerTransactionUrl(network, hash4) {
39400
- try {
39401
- const explorerUrl = getNetworkDefinition(network).explorerUrl;
39402
- return explorerUrl ? `${explorerUrl}/tx/${hash4}` : void 0;
39403
- } catch {
39404
- return void 0;
39405
- }
39406
- }
39407
- function explorerAddressUrl(network, address2) {
39408
- try {
39409
- const explorerUrl = getNetworkDefinition(network).explorerUrl;
39410
- return explorerUrl ? `${explorerUrl}/address/${address2}` : void 0;
39411
- } catch {
39412
- return void 0;
39413
- }
39414
- }
39415
- function areSamePaymentNetwork(left, right) {
39416
- return left === right || isSolanaNetwork(left) && isSolanaNetwork(right);
39417
- }
39418
- function isSupportedPaymentNetwork(network) {
39419
- if (isSolanaNetwork(network)) return true;
39420
- try {
39421
- parseEip155ChainId(network);
39422
- return true;
39423
- } catch {
39424
- return false;
39425
- }
39426
- }
39427
- function configuredNetworkFor(networks, network) {
39428
- const configured = networks[network];
39429
- if (configured) return configured;
39430
- if (network === X402_SOLANA_MAINNET_CAIP2) return networks[SOLANA_MAINNET_CAIP2];
39431
- if (network === SOLANA_MAINNET_CAIP2) return networks[X402_SOLANA_MAINNET_CAIP2];
39432
- return void 0;
39433
- }
39434
- function getNetworkDefinition(network) {
39435
- const known = NETWORKS[network];
39436
- if (known) {
39437
- return known;
39438
- }
39439
- const chainId = parseEip155ChainId(network);
39440
- return {
39441
- family: "evm",
39442
- chainId,
39443
- name: network,
39444
- usdc: getAddress("0x0000000000000000000000000000000000000000"),
39445
- gasToken: "ETH",
39446
- rpcEnv: ""
39447
- };
39448
- }
39449
- function requireRpcUrl(network, configured) {
39450
- const definition = getNetworkDefinition(network);
39451
- const envUrl = definition.rpcEnv ? process.env[definition.rpcEnv]?.trim() : void 0;
39452
- const rpcUrl = envUrl || configured.rpcUrl.trim();
39453
- if (rpcUrl) {
39454
- return rpcUrl;
39455
- }
39456
- if (network === ARC_TESTNET_CAIP2) {
39457
- throw new Error(
39458
- "Arc testnet RPC is required. Set ARC_TESTNET_RPC_URL or add rpcUrl for eip155:5042002 in config.json."
39459
- );
39460
- }
39461
- throw new Error(`RPC URL is required for ${network}.`);
39462
- }
39463
- function createChain(network, rpcUrl) {
39464
- const definition = getNetworkDefinition(network);
39465
- if (definition.family !== "evm" || definition.chainId === void 0) {
39466
- throw new Error(`Network ${network} is not an EVM chain.`);
38848
+ var invokeApiActionSchema = external_exports.looseObject({
38849
+ type: external_exports.literal("invoke_api"),
38850
+ href: marketplaceHrefSchema
38851
+ });
38852
+ var firstPartyApiMarketplaceHitSchema = external_exports.looseObject({
38853
+ ...marketplaceHitBase,
38854
+ kind: external_exports.literal("api"),
38855
+ provenance: firstPartyProvenanceSchema,
38856
+ execution: external_exports.looseObject({
38857
+ mode: executionModeSchema
38858
+ }),
38859
+ action: invokeApiActionSchema
38860
+ });
38861
+ var mirroredApiMarketplaceHitSchema = external_exports.looseObject({
38862
+ ...marketplaceHitBase,
38863
+ kind: external_exports.literal("api"),
38864
+ provenance: external_exports.literal("indexed"),
38865
+ execution: external_exports.looseObject({
38866
+ mode: external_exports.literal("direct"),
38867
+ url: external_exports.url().max(2048).regex(/^https:\/\/(?![^/?#]*@)/),
38868
+ method: marketplaceExecutionMethodSchema.nullable(),
38869
+ network: external_exports.string().trim().max(160).transform((network) => {
38870
+ if (network === "solana") return X402_SOLANA_MAINNET_CAIP2;
38871
+ if (network === "solana-devnet") return SOLANA_DEVNET_CAIP2;
38872
+ return network;
38873
+ }).pipe(
38874
+ external_exports.union([
38875
+ external_exports.string().regex(/^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$/),
38876
+ // Persisted mainnet configs also use the full genesis hash.
38877
+ external_exports.literal(SOLANA_MAINNET_CAIP2)
38878
+ ])
38879
+ )
38880
+ }),
38881
+ action: invokeApiActionSchema
38882
+ });
38883
+ var apiMarketplaceHitSchema = external_exports.discriminatedUnion("provenance", [
38884
+ firstPartyApiMarketplaceHitSchema,
38885
+ mirroredApiMarketplaceHitSchema
38886
+ ]);
38887
+ var serviceOfferMarketplaceHitSchema = external_exports.looseObject({
38888
+ ...marketplaceHitBase,
38889
+ kind: external_exports.literal("service_offer"),
38890
+ action: external_exports.looseObject({
38891
+ type: external_exports.literal("start_engagement"),
38892
+ href: marketplaceHrefSchema
38893
+ })
38894
+ });
38895
+ var openRequestMarketplaceHitSchema = external_exports.looseObject({
38896
+ ...marketplaceHitBase,
38897
+ kind: external_exports.literal("open_request"),
38898
+ action: external_exports.looseObject({
38899
+ type: external_exports.literal("propose_to_request"),
38900
+ href: marketplaceHrefSchema
38901
+ })
38902
+ });
38903
+ var marketplaceHitSchema = external_exports.union([
38904
+ apiMarketplaceHitSchema,
38905
+ serviceOfferMarketplaceHitSchema,
38906
+ openRequestMarketplaceHitSchema
38907
+ ]);
38908
+ var marketplaceDiscoveryInputSchema = external_exports.strictObject({
38909
+ q: external_exports.string().trim().max(200).optional(),
38910
+ kinds: external_exports.array(marketplaceKindSchema).min(1).max(MARKETPLACE_KINDS.length).optional(),
38911
+ network: external_exports.string().trim().min(1).max(160).optional(),
38912
+ cursor: external_exports.string().trim().min(1).max(4096).optional(),
38913
+ limit: external_exports.number().int().min(1).max(50).optional(),
38914
+ includeUnverified: external_exports.boolean().optional()
38915
+ }).superRefine((input2, context) => {
38916
+ if (input2.kinds && new Set(input2.kinds).size !== input2.kinds.length) {
38917
+ context.addIssue({
38918
+ code: "custom",
38919
+ path: ["kinds"],
38920
+ message: "Marketplace kinds must be unique"
38921
+ });
39467
38922
  }
39468
- return defineChain({
39469
- id: definition.chainId,
39470
- name: definition.name,
39471
- nativeCurrency: definition.gasToken === "USDC" ? { name: "USDC", symbol: "USDC", decimals: USDC_DECIMALS } : { name: "Ether", symbol: "ETH", decimals: 18 },
39472
- rpcUrls: {
39473
- default: { http: [rpcUrl] }
39474
- },
39475
- ...definition.explorerUrl ? {
39476
- blockExplorers: {
39477
- default: { name: `${definition.name} explorer`, url: definition.explorerUrl }
39478
- }
39479
- } : {}
39480
- });
39481
- }
39482
- function createNetworkPublicClient(network, configured, options = {}) {
39483
- const rpcUrl = requireRpcUrl(network, configured);
39484
- return createPublicClient({
39485
- chain: createChain(network, rpcUrl),
39486
- transport: createNetworkHttpTransport(rpcUrl, options)
39487
- });
39488
- }
39489
- function createNetworkHttpTransport(rpcUrl, options = {}) {
39490
- const fetchFn = options.fetch ?? createPublicFetch({
39491
- allowPrivateNetwork: options.allowPrivateNetwork ?? false,
39492
- ...options.lookup ? { lookup: options.lookup } : {}
39493
- });
39494
- return http(rpcUrl, { fetchFn, fetchOptions: { redirect: "manual" } });
39495
- }
39496
- function formatUsdc(amountAtomic) {
39497
- return formatUnits(amountAtomic, USDC_DECIMALS);
38923
+ });
38924
+ function isMirroredHit(hit) {
38925
+ return hit.kind === "api" && hit.provenance === "indexed";
39498
38926
  }
38927
+ var marketplaceDiscoveryEnvelopeSchema = external_exports.looseObject({
38928
+ protocol: external_exports.literal(MARKETPLACE_DISCOVERY_PROTOCOL),
38929
+ items: external_exports.array(external_exports.unknown()),
38930
+ nextCursor: external_exports.string().min(1).max(4096).nullable(),
38931
+ unavailableKinds: external_exports.array(marketplaceKindSchema).max(MARKETPLACE_KINDS.length),
38932
+ rankingVersion: external_exports.literal(MARKETPLACE_RANKING_VERSION)
38933
+ });
38934
+ var marketplaceDiscoveryPageSchema = marketplaceDiscoveryEnvelopeSchema.extend({
38935
+ items: external_exports.array(marketplaceHitSchema)
38936
+ });
39499
38937
 
39500
38938
  // ../../node_modules/.pnpm/@solana+errors@5.5.1_typescript@6.0.3/node_modules/@solana/errors/dist/index.node.mjs
39501
38939
  var SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1;
@@ -44477,16 +43915,16 @@ var DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;
44477
43915
  var DEFAULT_COMPUTE_UNIT_LIMIT = 2e4;
44478
43916
  var MAX_MEMO_BYTES = 256;
44479
43917
  var SOLANA_MAINNET_CAIP22 = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
44480
- var SOLANA_DEVNET_CAIP2 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
43918
+ var SOLANA_DEVNET_CAIP22 = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
44481
43919
  var SOLANA_TESTNET_CAIP2 = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
44482
43920
  var V1_TO_V2_NETWORK_MAP = {
44483
43921
  solana: SOLANA_MAINNET_CAIP22,
44484
- "solana-devnet": SOLANA_DEVNET_CAIP2,
43922
+ "solana-devnet": SOLANA_DEVNET_CAIP22,
44485
43923
  "solana-testnet": SOLANA_TESTNET_CAIP2
44486
43924
  };
44487
43925
  function normalizeNetwork(network) {
44488
43926
  if (network.includes(":")) {
44489
- const supported = [SOLANA_MAINNET_CAIP22, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2];
43927
+ const supported = [SOLANA_MAINNET_CAIP22, SOLANA_DEVNET_CAIP22, SOLANA_TESTNET_CAIP2];
44490
43928
  if (!supported.includes(network)) {
44491
43929
  throw new Error(`Unsupported SVM network: ${network}`);
44492
43930
  }
@@ -44534,7 +43972,7 @@ var DEFAULT_ASSETS = {
44534
43972
  tokenProgram: TOKEN_2022_PROGRAM_ADDRESS2
44535
43973
  }
44536
43974
  ],
44537
- [SOLANA_DEVNET_CAIP2]: [
43975
+ [SOLANA_DEVNET_CAIP22]: [
44538
43976
  {
44539
43977
  asset: USDC_DEVNET_ADDRESS,
44540
43978
  decimals: 6,
@@ -44575,218 +44013,588 @@ var DEFAULT_ASSETS = {
44575
44013
  }
44576
44014
  ]
44577
44015
  };
44578
- function resolveNetworkKey(network) {
44579
- return normalizeNetwork(network);
44016
+ function resolveNetworkKey(network) {
44017
+ return normalizeNetwork(network);
44018
+ }
44019
+ var findDefaultAsset = (asset, network) => {
44020
+ const key = resolveNetworkKey(network);
44021
+ const assets = DEFAULT_ASSETS[key];
44022
+ if (!assets) {
44023
+ return void 0;
44024
+ }
44025
+ return assets.find((entry) => entry.asset === asset);
44026
+ };
44027
+ function createRpcClient(network, customRpcUrl) {
44028
+ const caip2Network = normalizeNetwork(network);
44029
+ switch (caip2Network) {
44030
+ case SOLANA_DEVNET_CAIP22: {
44031
+ const url2 = customRpcUrl || DEVNET_RPC_URL;
44032
+ return createSolanaRpc(devnet(url2));
44033
+ }
44034
+ case SOLANA_TESTNET_CAIP2: {
44035
+ const url2 = customRpcUrl || TESTNET_RPC_URL;
44036
+ return createSolanaRpc(testnet(url2));
44037
+ }
44038
+ case SOLANA_MAINNET_CAIP22: {
44039
+ const url2 = customRpcUrl || MAINNET_RPC_URL;
44040
+ return createSolanaRpc(mainnet(url2));
44041
+ }
44042
+ default:
44043
+ throw new Error(`Unsupported network: ${network}`);
44044
+ }
44045
+ }
44046
+ async function resolveBlockhash(rpc, requirements) {
44047
+ const provided = requirements.extra?.recentBlockhash;
44048
+ if (typeof provided === "string" && provided !== "") {
44049
+ try {
44050
+ if (getBase58Encoder().encode(provided).length === 32) {
44051
+ const lastValid = requirements.extra?.lastValidBlockHeight;
44052
+ let lastValidBlockHeight = 0n;
44053
+ if (typeof lastValid === "string" && /^\d+$/.test(lastValid)) {
44054
+ lastValidBlockHeight = BigInt(lastValid);
44055
+ } else if (typeof lastValid === "number" && Number.isSafeInteger(lastValid) && lastValid >= 0) {
44056
+ lastValidBlockHeight = BigInt(lastValid);
44057
+ }
44058
+ return { blockhash: provided, lastValidBlockHeight };
44059
+ }
44060
+ } catch {
44061
+ }
44062
+ }
44063
+ const { value } = await rpc.getLatestBlockhash().send();
44064
+ return value;
44065
+ }
44066
+
44067
+ // ../../node_modules/.pnpm/@solana-program+compute-budget@0.11.0_@solana+kit@5.5.1_typescript@6.0.3_/node_modules/@solana-program/compute-budget/dist/src/index.mjs
44068
+ var COMPUTE_BUDGET_PROGRAM_ADDRESS = "ComputeBudget111111111111111111111111111111";
44069
+ var SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2;
44070
+ function getSetComputeUnitLimitInstructionDataEncoder() {
44071
+ return transformEncoder(
44072
+ getStructEncoder([
44073
+ ["discriminator", getU8Encoder()],
44074
+ ["units", getU32Encoder()]
44075
+ ]),
44076
+ (value) => ({
44077
+ ...value,
44078
+ discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR
44079
+ })
44080
+ );
44081
+ }
44082
+ function getSetComputeUnitLimitInstruction(input2, config2) {
44083
+ const programAddress = config2?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;
44084
+ const args = { ...input2 };
44085
+ return Object.freeze({
44086
+ data: getSetComputeUnitLimitInstructionDataEncoder().encode(
44087
+ args
44088
+ ),
44089
+ programAddress
44090
+ });
44091
+ }
44092
+ var SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3;
44093
+ function getSetComputeUnitPriceInstructionDataEncoder() {
44094
+ return transformEncoder(
44095
+ getStructEncoder([
44096
+ ["discriminator", getU8Encoder()],
44097
+ ["microLamports", getU64Encoder()]
44098
+ ]),
44099
+ (value) => ({
44100
+ ...value,
44101
+ discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR
44102
+ })
44103
+ );
44104
+ }
44105
+ function getSetComputeUnitPriceInstruction(input2, config2) {
44106
+ const programAddress = config2?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;
44107
+ const args = { ...input2 };
44108
+ return Object.freeze({
44109
+ data: getSetComputeUnitPriceInstructionDataEncoder().encode(
44110
+ args
44111
+ ),
44112
+ programAddress
44113
+ });
44114
+ }
44115
+ function setTransactionMessageComputeUnitPrice(microLamports, transactionMessage) {
44116
+ return appendTransactionMessageInstruction(
44117
+ getSetComputeUnitPriceInstruction({ microLamports }),
44118
+ transactionMessage
44119
+ );
44120
+ }
44121
+
44122
+ // ../../node_modules/.pnpm/@x402+svm@2.25.0_@solana+kit@5.5.1_typescript@6.0.3__@solana+sysvars@5.5.1_typescript@6.0.3_/node_modules/@x402/svm/dist/esm/chunk-FKOM6YTW.mjs
44123
+ var ExactSvmScheme = class {
44124
+ /**
44125
+ * Creates a new ExactSvmClient instance.
44126
+ *
44127
+ * @param signer - The SVM signer for client operations
44128
+ * @param config - Optional configuration with custom RPC URL
44129
+ * @returns ExactSvmClient instance
44130
+ */
44131
+ constructor(signer, config2) {
44132
+ this.signer = signer;
44133
+ this.config = config2;
44134
+ this.scheme = "exact";
44135
+ this.findDefaultAsset = findDefaultAsset;
44136
+ this.mintCache = /* @__PURE__ */ new Map();
44137
+ }
44138
+ /**
44139
+ * Creates a payment payload for the Exact scheme.
44140
+ *
44141
+ * @param x402Version - The x402 protocol version
44142
+ * @param paymentRequirements - The payment requirements
44143
+ * @returns Promise resolving to a payment payload
44144
+ */
44145
+ async createPaymentPayload(x402Version, paymentRequirements) {
44146
+ const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl);
44147
+ const mintMetadata = await getCachedMintMetadata(
44148
+ rpc,
44149
+ paymentRequirements.network,
44150
+ paymentRequirements.asset,
44151
+ this.mintCache
44152
+ );
44153
+ const tokenProgramAddress = mintMetadata.programAddress;
44154
+ if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) {
44155
+ throw new Error("Asset was not created by a known token program");
44156
+ }
44157
+ const [sourceATA] = await findAssociatedTokenPda({
44158
+ mint: paymentRequirements.asset,
44159
+ owner: this.signer.address,
44160
+ tokenProgram: tokenProgramAddress
44161
+ });
44162
+ const [destinationATA] = await findAssociatedTokenPda({
44163
+ mint: paymentRequirements.asset,
44164
+ owner: paymentRequirements.payTo,
44165
+ tokenProgram: tokenProgramAddress
44166
+ });
44167
+ const transferIx = getTransferCheckedInstruction(
44168
+ {
44169
+ source: sourceATA,
44170
+ mint: paymentRequirements.asset,
44171
+ destination: destinationATA,
44172
+ authority: this.signer,
44173
+ amount: BigInt(paymentRequirements.amount),
44174
+ decimals: mintMetadata.decimals
44175
+ },
44176
+ { programAddress: tokenProgramAddress }
44177
+ );
44178
+ const feePayer = paymentRequirements.extra?.feePayer;
44179
+ if (!feePayer) {
44180
+ throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions");
44181
+ }
44182
+ const latestBlockhash = await resolveBlockhash(rpc, paymentRequirements);
44183
+ const sellerMemo = paymentRequirements.extra?.memo;
44184
+ let memoData;
44185
+ if (sellerMemo) {
44186
+ memoData = new TextEncoder().encode(sellerMemo);
44187
+ if (memoData.byteLength > MAX_MEMO_BYTES) {
44188
+ throw new Error(`extra.memo exceeds maximum ${MAX_MEMO_BYTES} bytes`);
44189
+ }
44190
+ } else {
44191
+ const nonce = crypto.getRandomValues(new Uint8Array(16));
44192
+ memoData = new TextEncoder().encode(
44193
+ Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("")
44194
+ );
44195
+ }
44196
+ const memoIx = {
44197
+ programAddress: MEMO_PROGRAM_ADDRESS,
44198
+ accounts: [],
44199
+ data: memoData
44200
+ };
44201
+ const tx = pipe2(
44202
+ createTransactionMessage({ version: 0 }),
44203
+ (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2),
44204
+ (tx2) => setTransactionMessageFeePayer(feePayer, tx2),
44205
+ (tx2) => prependTransactionMessageInstruction(
44206
+ getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),
44207
+ tx2
44208
+ ),
44209
+ (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2),
44210
+ (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2)
44211
+ );
44212
+ const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);
44213
+ const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);
44214
+ const payload = {
44215
+ transaction: base64EncodedWireTransaction
44216
+ };
44217
+ return {
44218
+ x402Version,
44219
+ payload
44220
+ };
44221
+ }
44222
+ };
44223
+
44224
+ // ../../node_modules/.pnpm/@x402+svm@2.25.0_@solana+kit@5.5.1_typescript@6.0.3__@solana+sysvars@5.5.1_typescript@6.0.3_/node_modules/@x402/svm/dist/esm/chunk-N4DEEDTQ.mjs
44225
+ var addressEncoder = getAddressEncoder();
44226
+ var compiledMessageDecoder = getCompiledTransactionMessageDecoder();
44227
+
44228
+ // src/net-guard.ts
44229
+ import { lookup as dnsLookup } from "node:dns/promises";
44230
+ import { request as httpRequest } from "node:http";
44231
+ import { request as httpsRequest } from "node:https";
44232
+ import { isIP } from "node:net";
44233
+ import { Readable } from "node:stream";
44234
+ var defaultLookup = async (hostname3) => {
44235
+ const addresses = await dnsLookup(hostname3, { all: true });
44236
+ return addresses.map(({ address: address2 }) => address2);
44237
+ };
44238
+ async function assertPublicUrl(url2, options) {
44239
+ if (url2.username || url2.password) {
44240
+ throw guardError(url2);
44241
+ }
44242
+ if (url2.protocol !== "http:" && url2.protocol !== "https:") {
44243
+ throw guardError(url2);
44244
+ }
44245
+ if (options.allowPrivateNetwork) {
44246
+ return;
44247
+ }
44248
+ const hostname3 = normalizeHostname(url2.hostname);
44249
+ const lowercaseHostname = hostname3.toLowerCase();
44250
+ if (!lowercaseHostname || lowercaseHostname === "localhost" || lowercaseHostname.endsWith(".localhost") || lowercaseHostname.endsWith(".local") || lowercaseHostname.endsWith(".internal")) {
44251
+ throw guardError(url2);
44252
+ }
44253
+ if (isIP(hostname3)) {
44254
+ if (isNonPublicAddress(hostname3)) {
44255
+ throw guardError(url2);
44256
+ }
44257
+ return;
44258
+ }
44259
+ let addresses;
44260
+ try {
44261
+ addresses = await withTimeout2(
44262
+ (options.lookup ?? defaultLookup)(hostname3),
44263
+ options.timeoutMs ?? 5e3
44264
+ );
44265
+ } catch {
44266
+ throw guardError(url2);
44267
+ }
44268
+ if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
44269
+ throw guardError(url2);
44270
+ }
44271
+ }
44272
+ function createPublicFetch(options) {
44273
+ const lookupFn = options.lookup ?? defaultLookup;
44274
+ return (async (input2, init) => {
44275
+ const url2 = new URL(input2 instanceof Request ? input2.url : input2);
44276
+ await assertPublicUrl(url2, {
44277
+ allowPrivateNetwork: options.allowPrivateNetwork,
44278
+ lookup: lookupFn,
44279
+ timeoutMs: 5e3
44280
+ });
44281
+ const normalized = new Request(input2, init);
44282
+ const bytes = normalized.body ? Buffer.from(await normalized.arrayBuffer()) : null;
44283
+ return await new Promise((resolve2, reject) => {
44284
+ const requestOptions = {
44285
+ method: normalized.method,
44286
+ headers: Object.fromEntries(normalized.headers),
44287
+ signal: normalized.signal,
44288
+ ...options.allowPrivateNetwork ? {} : { lookup: pinnedLookup(lookupFn) }
44289
+ };
44290
+ const onResponse = (incoming) => {
44291
+ try {
44292
+ const headers = new Headers();
44293
+ for (const [name, value] of Object.entries(incoming.headers)) {
44294
+ if (Array.isArray(value)) {
44295
+ for (const item of value) headers.append(name, item);
44296
+ } else if (value !== void 0) {
44297
+ headers.set(name, value);
44298
+ }
44299
+ }
44300
+ const status = incoming.statusCode ?? 500;
44301
+ const bodyForbidden = normalized.method === "HEAD" || [204, 205, 304].includes(status);
44302
+ if (bodyForbidden) incoming.resume();
44303
+ const response = new Response(
44304
+ bodyForbidden ? null : Readable.toWeb(incoming),
44305
+ { status, statusText: incoming.statusMessage, headers }
44306
+ );
44307
+ Object.defineProperty(response, "url", { value: url2.toString() });
44308
+ resolve2(response);
44309
+ } catch (error61) {
44310
+ incoming.destroy();
44311
+ reject(error61);
44312
+ }
44313
+ };
44314
+ const request = url2.protocol === "https:" ? httpsRequest(url2, requestOptions, onResponse) : httpRequest(url2, requestOptions, onResponse);
44315
+ request.on("error", reject);
44316
+ if (bytes) request.write(bytes);
44317
+ request.end();
44318
+ });
44319
+ });
44320
+ }
44321
+ function pinnedLookup(lookup) {
44322
+ return (hostname3, dnsOptions, callback) => {
44323
+ void lookup(normalizeHostname(hostname3)).then((addresses) => {
44324
+ if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
44325
+ callback(guardError(new URL(`https://${hostname3}`)), "");
44326
+ return;
44327
+ }
44328
+ const address2 = addresses[0];
44329
+ const family = isIP(address2);
44330
+ callback(
44331
+ null,
44332
+ dnsOptions.all ? [{ address: address2, family }] : address2,
44333
+ dnsOptions.all ? void 0 : family
44334
+ );
44335
+ }).catch(
44336
+ (error61) => callback(error61 instanceof Error ? error61 : new Error("DNS lookup failed."), "")
44337
+ );
44338
+ };
44339
+ }
44340
+ async function withTimeout2(operation, timeoutMs) {
44341
+ let timeout;
44342
+ try {
44343
+ return await Promise.race([
44344
+ operation,
44345
+ new Promise((_resolve, reject) => {
44346
+ timeout = setTimeout(() => reject(new Error("DNS lookup timed out.")), timeoutMs);
44347
+ })
44348
+ ]);
44349
+ } finally {
44350
+ if (timeout) clearTimeout(timeout);
44351
+ }
44352
+ }
44353
+ function normalizeHostname(hostname3) {
44354
+ const unbracketed = hostname3.startsWith("[") && hostname3.endsWith("]") ? hostname3.slice(1, -1) : hostname3;
44355
+ return unbracketed.endsWith(".") ? unbracketed.slice(0, -1) : unbracketed;
44356
+ }
44357
+ function isNonPublicAddress(address2) {
44358
+ const normalized = normalizeHostname(address2);
44359
+ const version5 = isIP(normalized);
44360
+ if (version5 === 4) {
44361
+ return isNonPublicIpv4(parseIpv4(normalized));
44362
+ }
44363
+ if (version5 === 6) {
44364
+ return isNonPublicIpv6(parseIpv6(normalized));
44365
+ }
44366
+ return true;
44367
+ }
44368
+ function parseIpv4(address2) {
44369
+ const octets = address2.split(".").map(Number);
44370
+ return [octets[0], octets[1], octets[2], octets[3]];
44371
+ }
44372
+ function isNonPublicIpv4([first, second, third]) {
44373
+ return first === 0 || first === 10 || first === 100 && second >= 64 && second <= 127 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 0 && (third === 0 || third === 2) || first === 192 && second === 168 || first === 198 && second >= 18 && second <= 19 || first === 198 && second === 51 && third === 100 || first === 203 && second === 0 && third === 113 || first >= 224;
44374
+ }
44375
+ function parseIpv6(address2) {
44376
+ let normalized = address2.toLowerCase();
44377
+ const lastColon = normalized.lastIndexOf(":");
44378
+ const dottedTail = normalized.slice(lastColon + 1);
44379
+ if (dottedTail.includes(".")) {
44380
+ const [first, second, third, fourth] = parseIpv4(dottedTail);
44381
+ normalized = `${normalized.slice(0, lastColon + 1)}${(first << 8 | second).toString(16)}:${(third << 8 | fourth).toString(16)}`;
44382
+ }
44383
+ const halves = normalized.split("::");
44384
+ const left = halves[0] ? halves[0].split(":").map(parseHex) : [];
44385
+ const right = halves[1] ? halves[1].split(":").map(parseHex) : [];
44386
+ const omittedCount = 8 - left.length - right.length;
44387
+ return halves.length === 2 ? [...left, ...Array.from({ length: omittedCount }, () => 0), ...right] : left;
44388
+ }
44389
+ function parseHex(value) {
44390
+ return Number.parseInt(value, 16);
44391
+ }
44392
+ function isNonPublicIpv6(hextets) {
44393
+ if (hextets.slice(0, 5).every((hextet) => hextet === 0) && hextets[5] === 65535) {
44394
+ const embeddedIpv4 = [
44395
+ hextets[6] >> 8,
44396
+ hextets[6] & 255,
44397
+ hextets[7] >> 8,
44398
+ hextets[7] & 255
44399
+ ];
44400
+ return isNonPublicIpv4(embeddedIpv4);
44401
+ }
44402
+ if (hextets.slice(0, 6).every((hextet) => hextet === 0)) {
44403
+ const compatibleIpv4 = [
44404
+ hextets[6] >> 8,
44405
+ hextets[6] & 255,
44406
+ hextets[7] >> 8,
44407
+ hextets[7] & 255
44408
+ ];
44409
+ if (isNonPublicIpv4(compatibleIpv4)) return true;
44410
+ }
44411
+ const isUnspecified = hextets.every((hextet) => hextet === 0);
44412
+ const isLoopback = hextets.slice(0, 7).every((hextet) => hextet === 0) && hextets[7] === 1;
44413
+ const first = hextets[0];
44414
+ const isUniqueLocal = first >= 64512 && first <= 65023;
44415
+ const isLinkLocal = first >= 65152 && first <= 65215;
44416
+ const isSiteLocal = first >= 65216 && first <= 65279;
44417
+ const isMulticast = first >= 65280;
44418
+ const isDocumentation = first === 8193 && hextets[1] === 3512;
44419
+ return isUnspecified || isLoopback || isUniqueLocal || isLinkLocal || isSiteLocal || isMulticast || isDocumentation;
44420
+ }
44421
+ function guardError(url2) {
44422
+ return new Error(
44423
+ `URL hostname ${JSON.stringify(url2.hostname)} is not allowed; private or internal destinations require allowPrivateNetwork true in the vAPI config.`
44424
+ );
44425
+ }
44426
+
44427
+ // src/networks.ts
44428
+ var USDC_DECIMALS = 6;
44429
+ var DEFAULT_ARC_GAS_HEADROOM_ATOMIC = 50000n;
44430
+ var NETWORKS2 = {
44431
+ [BASE_MAINNET_CAIP2]: {
44432
+ family: "evm",
44433
+ chainId: 8453,
44434
+ name: "Base mainnet",
44435
+ usdc: CANONICAL_X402_USDC_NETWORKS[BASE_MAINNET_CAIP2].usdc,
44436
+ gasToken: "ETH",
44437
+ rpcEnv: "BASE_RPC_URL",
44438
+ publicRpcUrl: "https://mainnet.base.org",
44439
+ explorerUrl: "https://basescan.org"
44440
+ },
44441
+ [ARC_MAINNET_CAIP2]: {
44442
+ family: "evm",
44443
+ chainId: 5042,
44444
+ name: "Arc mainnet",
44445
+ usdc: CANONICAL_X402_USDC_NETWORKS[ARC_MAINNET_CAIP2].usdc,
44446
+ gasToken: "USDC",
44447
+ rpcEnv: "ARC_RPC_URL",
44448
+ publicRpcUrl: "https://rpc.mainnet.arc.io",
44449
+ explorerUrl: "https://explorer.arc.io"
44450
+ },
44451
+ [ARC_TESTNET_CAIP2]: {
44452
+ family: "evm",
44453
+ chainId: 5042002,
44454
+ name: "Arc testnet",
44455
+ usdc: CANONICAL_X402_USDC_NETWORKS[ARC_TESTNET_CAIP2].usdc,
44456
+ gasToken: "USDC",
44457
+ rpcEnv: "ARC_TESTNET_RPC_URL"
44458
+ },
44459
+ [SOLANA_MAINNET_CAIP2]: {
44460
+ family: "svm",
44461
+ name: "Solana mainnet",
44462
+ usdc: SOLANA_MAINNET_USDC,
44463
+ gasToken: "SOL",
44464
+ rpcEnv: "SOLANA_RPC_URL",
44465
+ publicRpcUrl: "https://api.mainnet-beta.solana.com"
44466
+ },
44467
+ [X402_SOLANA_MAINNET_CAIP2]: {
44468
+ family: "svm",
44469
+ name: "Solana mainnet",
44470
+ usdc: SOLANA_MAINNET_USDC,
44471
+ gasToken: "SOL",
44472
+ rpcEnv: "SOLANA_RPC_URL",
44473
+ publicRpcUrl: "https://api.mainnet-beta.solana.com"
44474
+ }
44475
+ };
44476
+ function parseEip155ChainId(network) {
44477
+ const match = /^eip155:(\d+)$/.exec(network);
44478
+ if (!match) {
44479
+ throw new Error(`Unsupported network ${network}; expected eip155:<chainId>.`);
44480
+ }
44481
+ const chainId = Number(match[1]);
44482
+ if (!Number.isSafeInteger(chainId) || chainId <= 0) {
44483
+ throw new Error(`Invalid EVM chain ID in network ${network}.`);
44484
+ }
44485
+ return chainId;
44580
44486
  }
44581
- var findDefaultAsset = (asset, network) => {
44582
- const key = resolveNetworkKey(network);
44583
- const assets = DEFAULT_ASSETS[key];
44584
- if (!assets) {
44487
+ function isSolanaNetwork(network) {
44488
+ return network === SOLANA_MAINNET_CAIP2 || network === X402_SOLANA_MAINNET_CAIP2;
44489
+ }
44490
+ function usesUsdcGas(network) {
44491
+ try {
44492
+ return getNetworkDefinition(network).gasToken === "USDC";
44493
+ } catch {
44494
+ return false;
44495
+ }
44496
+ }
44497
+ function explorerTransactionUrl(network, hash4) {
44498
+ try {
44499
+ const explorerUrl = getNetworkDefinition(network).explorerUrl;
44500
+ return explorerUrl ? `${explorerUrl}/tx/${hash4}` : void 0;
44501
+ } catch {
44585
44502
  return void 0;
44586
44503
  }
44587
- return assets.find((entry) => entry.asset === asset);
44588
- };
44589
- function createRpcClient(network, customRpcUrl) {
44590
- const caip2Network = normalizeNetwork(network);
44591
- switch (caip2Network) {
44592
- case SOLANA_DEVNET_CAIP2: {
44593
- const url2 = customRpcUrl || DEVNET_RPC_URL;
44594
- return createSolanaRpc(devnet(url2));
44595
- }
44596
- case SOLANA_TESTNET_CAIP2: {
44597
- const url2 = customRpcUrl || TESTNET_RPC_URL;
44598
- return createSolanaRpc(testnet(url2));
44599
- }
44600
- case SOLANA_MAINNET_CAIP22: {
44601
- const url2 = customRpcUrl || MAINNET_RPC_URL;
44602
- return createSolanaRpc(mainnet(url2));
44603
- }
44604
- default:
44605
- throw new Error(`Unsupported network: ${network}`);
44504
+ }
44505
+ function explorerAddressUrl(network, address2) {
44506
+ try {
44507
+ const explorerUrl = getNetworkDefinition(network).explorerUrl;
44508
+ return explorerUrl ? `${explorerUrl}/address/${address2}` : void 0;
44509
+ } catch {
44510
+ return void 0;
44606
44511
  }
44607
44512
  }
44608
- async function resolveBlockhash(rpc, requirements) {
44609
- const provided = requirements.extra?.recentBlockhash;
44610
- if (typeof provided === "string" && provided !== "") {
44611
- try {
44612
- if (getBase58Encoder().encode(provided).length === 32) {
44613
- const lastValid = requirements.extra?.lastValidBlockHeight;
44614
- let lastValidBlockHeight = 0n;
44615
- if (typeof lastValid === "string" && /^\d+$/.test(lastValid)) {
44616
- lastValidBlockHeight = BigInt(lastValid);
44617
- } else if (typeof lastValid === "number" && Number.isSafeInteger(lastValid) && lastValid >= 0) {
44618
- lastValidBlockHeight = BigInt(lastValid);
44619
- }
44620
- return { blockhash: provided, lastValidBlockHeight };
44621
- }
44622
- } catch {
44623
- }
44513
+ function areSamePaymentNetwork(left, right) {
44514
+ return left === right || isSolanaNetwork(left) && isSolanaNetwork(right);
44515
+ }
44516
+ function isSupportedPaymentNetwork(network) {
44517
+ if (isSolanaNetwork(network)) return true;
44518
+ try {
44519
+ parseEip155ChainId(network);
44520
+ return true;
44521
+ } catch {
44522
+ return false;
44624
44523
  }
44625
- const { value } = await rpc.getLatestBlockhash().send();
44626
- return value;
44627
44524
  }
44628
-
44629
- // ../../node_modules/.pnpm/@solana-program+compute-budget@0.11.0_@solana+kit@5.5.1_typescript@6.0.3_/node_modules/@solana-program/compute-budget/dist/src/index.mjs
44630
- var COMPUTE_BUDGET_PROGRAM_ADDRESS = "ComputeBudget111111111111111111111111111111";
44631
- var SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2;
44632
- function getSetComputeUnitLimitInstructionDataEncoder() {
44633
- return transformEncoder(
44634
- getStructEncoder([
44635
- ["discriminator", getU8Encoder()],
44636
- ["units", getU32Encoder()]
44637
- ]),
44638
- (value) => ({
44639
- ...value,
44640
- discriminator: SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR
44641
- })
44642
- );
44525
+ function configuredNetworkFor(networks, network) {
44526
+ const configured = networks[network];
44527
+ if (configured) return configured;
44528
+ if (network === X402_SOLANA_MAINNET_CAIP2) return networks[SOLANA_MAINNET_CAIP2];
44529
+ if (network === SOLANA_MAINNET_CAIP2) return networks[X402_SOLANA_MAINNET_CAIP2];
44530
+ return void 0;
44643
44531
  }
44644
- function getSetComputeUnitLimitInstruction(input2, config2) {
44645
- const programAddress = config2?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;
44646
- const args = { ...input2 };
44647
- return Object.freeze({
44648
- data: getSetComputeUnitLimitInstructionDataEncoder().encode(
44649
- args
44650
- ),
44651
- programAddress
44532
+ function getNetworkDefinition(network) {
44533
+ const known = NETWORKS2[network];
44534
+ if (known) {
44535
+ return known;
44536
+ }
44537
+ const chainId = parseEip155ChainId(network);
44538
+ return {
44539
+ family: "evm",
44540
+ chainId,
44541
+ name: network,
44542
+ usdc: getAddress("0x0000000000000000000000000000000000000000"),
44543
+ gasToken: "ETH",
44544
+ rpcEnv: ""
44545
+ };
44546
+ }
44547
+ function requireRpcUrl(network, configured) {
44548
+ const definition = getNetworkDefinition(network);
44549
+ const envUrl = definition.rpcEnv ? process.env[definition.rpcEnv]?.trim() : void 0;
44550
+ const rpcUrl = envUrl || configured.rpcUrl.trim();
44551
+ if (rpcUrl) {
44552
+ return rpcUrl;
44553
+ }
44554
+ if (network === ARC_TESTNET_CAIP2) {
44555
+ throw new Error(
44556
+ "Arc testnet RPC is required. Set ARC_TESTNET_RPC_URL or add rpcUrl for eip155:5042002 in config.json."
44557
+ );
44558
+ }
44559
+ throw new Error(`RPC URL is required for ${network}.`);
44560
+ }
44561
+ function createChain(network, rpcUrl) {
44562
+ const definition = getNetworkDefinition(network);
44563
+ if (definition.family !== "evm" || definition.chainId === void 0) {
44564
+ throw new Error(`Network ${network} is not an EVM chain.`);
44565
+ }
44566
+ return defineChain({
44567
+ id: definition.chainId,
44568
+ name: definition.name,
44569
+ nativeCurrency: definition.gasToken === "USDC" ? { name: "USDC", symbol: "USDC", decimals: USDC_DECIMALS } : { name: "Ether", symbol: "ETH", decimals: 18 },
44570
+ rpcUrls: {
44571
+ default: { http: [rpcUrl] }
44572
+ },
44573
+ ...definition.explorerUrl ? {
44574
+ blockExplorers: {
44575
+ default: { name: `${definition.name} explorer`, url: definition.explorerUrl }
44576
+ }
44577
+ } : {}
44652
44578
  });
44653
44579
  }
44654
- var SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3;
44655
- function getSetComputeUnitPriceInstructionDataEncoder() {
44656
- return transformEncoder(
44657
- getStructEncoder([
44658
- ["discriminator", getU8Encoder()],
44659
- ["microLamports", getU64Encoder()]
44660
- ]),
44661
- (value) => ({
44662
- ...value,
44663
- discriminator: SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR
44664
- })
44665
- );
44580
+ function createNetworkPublicClient(network, configured, options = {}) {
44581
+ const rpcUrl = requireRpcUrl(network, configured);
44582
+ return createPublicClient({
44583
+ chain: createChain(network, rpcUrl),
44584
+ transport: createNetworkHttpTransport(rpcUrl, options)
44585
+ });
44666
44586
  }
44667
- function getSetComputeUnitPriceInstruction(input2, config2) {
44668
- const programAddress = config2?.programAddress ?? COMPUTE_BUDGET_PROGRAM_ADDRESS;
44669
- const args = { ...input2 };
44670
- return Object.freeze({
44671
- data: getSetComputeUnitPriceInstructionDataEncoder().encode(
44672
- args
44673
- ),
44674
- programAddress
44587
+ function createNetworkHttpTransport(rpcUrl, options = {}) {
44588
+ const fetchFn = options.fetch ?? createPublicFetch({
44589
+ allowPrivateNetwork: options.allowPrivateNetwork ?? false,
44590
+ ...options.lookup ? { lookup: options.lookup } : {}
44675
44591
  });
44592
+ return http(rpcUrl, { fetchFn, fetchOptions: { redirect: "manual" } });
44676
44593
  }
44677
- function setTransactionMessageComputeUnitPrice(microLamports, transactionMessage) {
44678
- return appendTransactionMessageInstruction(
44679
- getSetComputeUnitPriceInstruction({ microLamports }),
44680
- transactionMessage
44681
- );
44594
+ function formatUsdc(amountAtomic) {
44595
+ return formatUnits(amountAtomic, USDC_DECIMALS);
44682
44596
  }
44683
44597
 
44684
- // ../../node_modules/.pnpm/@x402+svm@2.25.0_@solana+kit@5.5.1_typescript@6.0.3__@solana+sysvars@5.5.1_typescript@6.0.3_/node_modules/@x402/svm/dist/esm/chunk-FKOM6YTW.mjs
44685
- var ExactSvmScheme = class {
44686
- /**
44687
- * Creates a new ExactSvmClient instance.
44688
- *
44689
- * @param signer - The SVM signer for client operations
44690
- * @param config - Optional configuration with custom RPC URL
44691
- * @returns ExactSvmClient instance
44692
- */
44693
- constructor(signer, config2) {
44694
- this.signer = signer;
44695
- this.config = config2;
44696
- this.scheme = "exact";
44697
- this.findDefaultAsset = findDefaultAsset;
44698
- this.mintCache = /* @__PURE__ */ new Map();
44699
- }
44700
- /**
44701
- * Creates a payment payload for the Exact scheme.
44702
- *
44703
- * @param x402Version - The x402 protocol version
44704
- * @param paymentRequirements - The payment requirements
44705
- * @returns Promise resolving to a payment payload
44706
- */
44707
- async createPaymentPayload(x402Version, paymentRequirements) {
44708
- const rpc = createRpcClient(paymentRequirements.network, this.config?.rpcUrl);
44709
- const mintMetadata = await getCachedMintMetadata(
44710
- rpc,
44711
- paymentRequirements.network,
44712
- paymentRequirements.asset,
44713
- this.mintCache
44714
- );
44715
- const tokenProgramAddress = mintMetadata.programAddress;
44716
- if (tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() && tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()) {
44717
- throw new Error("Asset was not created by a known token program");
44718
- }
44719
- const [sourceATA] = await findAssociatedTokenPda({
44720
- mint: paymentRequirements.asset,
44721
- owner: this.signer.address,
44722
- tokenProgram: tokenProgramAddress
44723
- });
44724
- const [destinationATA] = await findAssociatedTokenPda({
44725
- mint: paymentRequirements.asset,
44726
- owner: paymentRequirements.payTo,
44727
- tokenProgram: tokenProgramAddress
44728
- });
44729
- const transferIx = getTransferCheckedInstruction(
44730
- {
44731
- source: sourceATA,
44732
- mint: paymentRequirements.asset,
44733
- destination: destinationATA,
44734
- authority: this.signer,
44735
- amount: BigInt(paymentRequirements.amount),
44736
- decimals: mintMetadata.decimals
44737
- },
44738
- { programAddress: tokenProgramAddress }
44739
- );
44740
- const feePayer = paymentRequirements.extra?.feePayer;
44741
- if (!feePayer) {
44742
- throw new Error("feePayer is required in paymentRequirements.extra for SVM transactions");
44743
- }
44744
- const latestBlockhash = await resolveBlockhash(rpc, paymentRequirements);
44745
- const sellerMemo = paymentRequirements.extra?.memo;
44746
- let memoData;
44747
- if (sellerMemo) {
44748
- memoData = new TextEncoder().encode(sellerMemo);
44749
- if (memoData.byteLength > MAX_MEMO_BYTES) {
44750
- throw new Error(`extra.memo exceeds maximum ${MAX_MEMO_BYTES} bytes`);
44751
- }
44752
- } else {
44753
- const nonce = crypto.getRandomValues(new Uint8Array(16));
44754
- memoData = new TextEncoder().encode(
44755
- Array.from(nonce).map((b) => b.toString(16).padStart(2, "0")).join("")
44756
- );
44757
- }
44758
- const memoIx = {
44759
- programAddress: MEMO_PROGRAM_ADDRESS,
44760
- accounts: [],
44761
- data: memoData
44762
- };
44763
- const tx = pipe2(
44764
- createTransactionMessage({ version: 0 }),
44765
- (tx2) => setTransactionMessageComputeUnitPrice(DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, tx2),
44766
- (tx2) => setTransactionMessageFeePayer(feePayer, tx2),
44767
- (tx2) => prependTransactionMessageInstruction(
44768
- getSetComputeUnitLimitInstruction({ units: DEFAULT_COMPUTE_UNIT_LIMIT }),
44769
- tx2
44770
- ),
44771
- (tx2) => appendTransactionMessageInstructions([transferIx, memoIx], tx2),
44772
- (tx2) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx2)
44773
- );
44774
- const signedTransaction = await partiallySignTransactionMessageWithSigners(tx);
44775
- const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);
44776
- const payload = {
44777
- transaction: base64EncodedWireTransaction
44778
- };
44779
- return {
44780
- x402Version,
44781
- payload
44782
- };
44783
- }
44784
- };
44785
-
44786
- // ../../node_modules/.pnpm/@x402+svm@2.25.0_@solana+kit@5.5.1_typescript@6.0.3__@solana+sysvars@5.5.1_typescript@6.0.3_/node_modules/@x402/svm/dist/esm/chunk-N4DEEDTQ.mjs
44787
- var addressEncoder = getAddressEncoder();
44788
- var compiledMessageDecoder = getCompiledTransactionMessageDecoder();
44789
-
44790
44598
  // src/x402.ts
44791
44599
  var MAX_CHALLENGE_BYTES = 1048576;
44792
44600
  var MAX_UINT256 = (1n << 256n) - 1n;
@@ -45646,6 +45454,237 @@ function isRecord2(value) {
45646
45454
  return typeof value === "object" && value !== null && !Array.isArray(value);
45647
45455
  }
45648
45456
 
45457
+ // src/call-contracts-wire.ts
45458
+ var CALLABLE_KIND = "agent";
45459
+ var CALLABLE_CATEGORIES = ["ai", "data", "crypto", "compute", "search"];
45460
+ var callableCategorySchema = external_exports.enum(CALLABLE_CATEGORIES);
45461
+ var DISCOVERY_CATEGORIES = [...CALLABLE_CATEGORIES, "other"];
45462
+ var discoveryCategorySchema = external_exports.enum(DISCOVERY_CATEGORIES);
45463
+ var CALLABLE_CATEGORY_LABELS = {
45464
+ ai: { catalog: "AI / LLM", publish: "AI and models" },
45465
+ data: { catalog: "Data", publish: "Data" },
45466
+ crypto: { catalog: "Crypto", publish: "Crypto" },
45467
+ compute: { catalog: "Compute", publish: "Compute" },
45468
+ search: { catalog: "Search", publish: "Search" }
45469
+ };
45470
+ var CALLABLE_CATEGORY_SET = new Set(CALLABLE_CATEGORIES);
45471
+ function isCallableListing(kind, category) {
45472
+ return kind === CALLABLE_KIND && CALLABLE_CATEGORY_SET.has(category);
45473
+ }
45474
+ var serviceTierSchema = external_exports.enum(["listed", "verified", "partner"]);
45475
+ var discoveryEndpointSchema = external_exports.looseObject({
45476
+ name: external_exports.string(),
45477
+ method: external_exports.string(),
45478
+ url: external_exports.url(),
45479
+ price: external_exports.string(),
45480
+ description: external_exports.string(),
45481
+ operationId: external_exports.string().trim().min(1).optional(),
45482
+ requestContentType: external_exports.string().trim().min(1).optional(),
45483
+ requestSchema: external_exports.json().optional(),
45484
+ responseContentType: external_exports.string().trim().min(1).optional(),
45485
+ pathTemplate: external_exports.string().trim().min(1).optional(),
45486
+ pathParameters: external_exports.array(external_exports.string().trim().min(1)).optional(),
45487
+ payment: external_exports.union([
45488
+ external_exports.looseObject({
45489
+ scheme: external_exports.literal("exact"),
45490
+ network: external_exports.string().regex(/^eip155:\d+$/),
45491
+ asset: external_exports.string().regex(/^0x[0-9a-fA-F]{40}$/),
45492
+ payTo: external_exports.string().regex(/^0x[0-9a-fA-F]{40}$/),
45493
+ checkedAt: external_exports.iso.datetime()
45494
+ }),
45495
+ external_exports.looseObject({
45496
+ scheme: external_exports.literal("exact"),
45497
+ network: external_exports.union([
45498
+ external_exports.string().regex(/^solana:[-_a-zA-Z0-9]{1,32}$/),
45499
+ external_exports.literal(SOLANA_MAINNET_CAIP2)
45500
+ ]),
45501
+ asset: external_exports.string().refine(isSolanaAddress, "Expected a Solana base58 address."),
45502
+ payTo: external_exports.string().refine(isSolanaAddress, "Expected a Solana base58 address."),
45503
+ checkedAt: external_exports.iso.datetime()
45504
+ })
45505
+ ]).optional()
45506
+ });
45507
+ var serviceSummarySchema = external_exports.looseObject({
45508
+ id: external_exports.string(),
45509
+ name: external_exports.string(),
45510
+ description: external_exports.string(),
45511
+ category: discoveryCategorySchema,
45512
+ tier: serviceTierSchema,
45513
+ ...listingDisclosureShape,
45514
+ verified: external_exports.boolean(),
45515
+ wrapped: external_exports.boolean(),
45516
+ price: external_exports.string(),
45517
+ networks: external_exports.array(external_exports.string()),
45518
+ endpoints: external_exports.array(discoveryEndpointSchema)
45519
+ });
45520
+ var searchServicesResponseSchema = external_exports.looseObject({
45521
+ services: external_exports.array(serviceSummarySchema)
45522
+ });
45523
+ var listServicesResponseSchema = searchServicesResponseSchema;
45524
+ var discoveryServiceSchema = serviceSummarySchema;
45525
+ var discoveryResponseSchema = searchServicesResponseSchema;
45526
+
45527
+ // src/call-contracts.ts
45528
+ var DiscoveryCatalogError = class extends Error {
45529
+ constructor(code, message, serviceId, paymentNetworks) {
45530
+ super(message);
45531
+ this.paymentNetworks = paymentNetworks;
45532
+ this.code = code;
45533
+ this.serviceId = serviceId;
45534
+ }
45535
+ paymentNetworks;
45536
+ name = "DiscoveryCatalogError";
45537
+ code;
45538
+ serviceId;
45539
+ };
45540
+ function isDiscoveryCatalogError(error61) {
45541
+ if (!(error61 instanceof Error) || error61.name !== "DiscoveryCatalogError" || !("code" in error61) || typeof error61.code !== "string") {
45542
+ return false;
45543
+ }
45544
+ const networks = Reflect.get(error61, "paymentNetworks");
45545
+ return networks === void 0 || Array.isArray(networks) && networks.every((network) => typeof network === "string");
45546
+ }
45547
+ function parseDiscovery(raw) {
45548
+ const parsed = discoveryResponseSchema.safeParse(raw);
45549
+ if (!parsed.success) {
45550
+ const malformedUrl = parsed.error.issues.find(
45551
+ (issue2) => issue2.path.at(-1) === "url" && issue2.path.includes("endpoints")
45552
+ );
45553
+ if (malformedUrl) {
45554
+ const serviceIndex = pathIndexAfter(malformedUrl.path, "services");
45555
+ const serviceId = rawServiceId(raw, serviceIndex);
45556
+ throw new DiscoveryCatalogError(
45557
+ "malformed_url",
45558
+ `Service ${JSON.stringify(serviceId ?? "unknown")} has a malformed endpoint URL.`,
45559
+ serviceId
45560
+ );
45561
+ }
45562
+ throw new DiscoveryCatalogError("invalid_discovery", "Discovery response is malformed.");
45563
+ }
45564
+ for (const service of parsed.data.services) {
45565
+ buildTargets(service);
45566
+ }
45567
+ const resolveListing = (serviceId, endpointName) => {
45568
+ const service = parsed.data.services.find((candidate) => candidate.id === serviceId);
45569
+ if (!service) {
45570
+ throw new DiscoveryCatalogError(
45571
+ "service_not_found",
45572
+ `No payable endpoint found for service ${JSON.stringify(serviceId)}.`,
45573
+ serviceId
45574
+ );
45575
+ }
45576
+ return { service, endpoint: resolveTarget(service, endpointName) };
45577
+ };
45578
+ return {
45579
+ services: parsed.data.services,
45580
+ resolve: (serviceId, endpointName) => resolveListing(serviceId, endpointName).endpoint,
45581
+ resolveListing
45582
+ };
45583
+ }
45584
+ function resolveTarget(service, endpointName) {
45585
+ const { targets, targetsByName } = buildTargets(service);
45586
+ if (endpointName !== void 0) {
45587
+ const selected = targetsByName.get(endpointName.trim());
45588
+ if (!selected) {
45589
+ throw new DiscoveryCatalogError(
45590
+ "endpoint_not_found",
45591
+ `Service ${JSON.stringify(service.id)} has no endpoint ${JSON.stringify(endpointName)}. Available endpoints: ${[...targetsByName.keys()].join(", ")}.`,
45592
+ service.id
45593
+ );
45594
+ }
45595
+ return { ...selected };
45596
+ }
45597
+ if (targets.size !== 1) {
45598
+ const paymentNetworks = service.endpoints.flatMap(
45599
+ (endpoint) => endpoint.payment ? [endpoint.payment.network] : []
45600
+ );
45601
+ throw new DiscoveryCatalogError(
45602
+ "ambiguous_default",
45603
+ `Service ${JSON.stringify(service.id)} has ${targets.size} distinct payable endpoints. Choose one with endpoint: ${[...targetsByName.keys()].join(", ")}.`,
45604
+ service.id,
45605
+ paymentNetworks.length === service.endpoints.length ? paymentNetworks : void 0
45606
+ );
45607
+ }
45608
+ return targets.values().next().value;
45609
+ }
45610
+ function buildTargets(service) {
45611
+ if (service.endpoints.length === 0) {
45612
+ throw new DiscoveryCatalogError(
45613
+ "no_endpoint",
45614
+ `Service ${JSON.stringify(service.id)} has no payable endpoint.`,
45615
+ service.id
45616
+ );
45617
+ }
45618
+ const namedEndpoints = [...service.endpoints].sort(
45619
+ (left, right) => compareNames(left.name.trim(), right.name.trim())
45620
+ );
45621
+ const names = /* @__PURE__ */ new Set();
45622
+ const targets = /* @__PURE__ */ new Map();
45623
+ const targetsByName = /* @__PURE__ */ new Map();
45624
+ for (const endpoint of namedEndpoints) {
45625
+ const name = endpoint.name.trim();
45626
+ if (!name) {
45627
+ throw new DiscoveryCatalogError(
45628
+ "invalid_endpoint_name",
45629
+ `Service ${JSON.stringify(service.id)} has a blank endpoint name.`,
45630
+ service.id
45631
+ );
45632
+ }
45633
+ if (names.has(name)) {
45634
+ throw new DiscoveryCatalogError(
45635
+ "duplicate_endpoint_name",
45636
+ `Service ${JSON.stringify(service.id)} has duplicate endpoint name ${JSON.stringify(name)}.`,
45637
+ service.id
45638
+ );
45639
+ }
45640
+ names.add(name);
45641
+ const method = endpoint.method.trim().toUpperCase();
45642
+ if (!method) {
45643
+ throw new DiscoveryCatalogError(
45644
+ "blank_method",
45645
+ `Service ${JSON.stringify(service.id)} has a blank endpoint method.`,
45646
+ service.id
45647
+ );
45648
+ }
45649
+ const url2 = new URL(endpoint.url);
45650
+ if (url2.protocol !== "http:" && url2.protocol !== "https:") {
45651
+ throw new DiscoveryCatalogError(
45652
+ "malformed_url",
45653
+ `Service ${JSON.stringify(service.id)} has a non-HTTP endpoint URL.`,
45654
+ service.id
45655
+ );
45656
+ }
45657
+ const transportKey = `${method}\0${endpoint.url}`;
45658
+ const normalized = { ...endpoint, name, method };
45659
+ targetsByName.set(name, normalized);
45660
+ if (!targets.has(transportKey)) targets.set(transportKey, normalized);
45661
+ }
45662
+ return { targets, targetsByName };
45663
+ }
45664
+ function compareNames(left, right) {
45665
+ return left < right ? -1 : left > right ? 1 : 0;
45666
+ }
45667
+ function pathIndexAfter(path, key) {
45668
+ const keyIndex = path.indexOf(key);
45669
+ const candidate = path[keyIndex + 1];
45670
+ return typeof candidate === "number" ? candidate : void 0;
45671
+ }
45672
+ function rawServiceId(raw, serviceIndex) {
45673
+ if (serviceIndex === void 0 || typeof raw !== "object" || raw === null) {
45674
+ return void 0;
45675
+ }
45676
+ const services = Reflect.get(raw, "services");
45677
+ if (!Array.isArray(services)) {
45678
+ return void 0;
45679
+ }
45680
+ const service = services[serviceIndex];
45681
+ if (typeof service !== "object" || service === null) {
45682
+ return void 0;
45683
+ }
45684
+ const id = Reflect.get(service, "id");
45685
+ return typeof id === "string" ? id : void 0;
45686
+ }
45687
+
45649
45688
  // src/sweep.ts
45650
45689
  var ERC20_ABI = [
45651
45690
  {
@@ -46497,7 +46536,7 @@ var configSchema = external_exports.object({
46497
46536
  }
46498
46537
  for (const [network, configured] of Object.entries(config2.networks)) {
46499
46538
  if (isSolanaNetwork(network)) {
46500
- if (configured.usdc !== NETWORKS[SOLANA_MAINNET_CAIP2].usdc) {
46539
+ if (configured.usdc !== NETWORKS2[SOLANA_MAINNET_CAIP2].usdc) {
46501
46540
  context.addIssue({
46502
46541
  code: "custom",
46503
46542
  path: ["networks", network, "usdc"],
@@ -46508,7 +46547,7 @@ var configSchema = external_exports.object({
46508
46547
  }
46509
46548
  try {
46510
46549
  const usdc = getAddress(configured.usdc);
46511
- if ((network === ARC_MAINNET_CAIP2 || network === ARC_TESTNET_CAIP2) && usdc !== getAddress(NETWORKS[network].usdc)) {
46550
+ if ((network === ARC_MAINNET_CAIP2 || network === ARC_TESTNET_CAIP2) && usdc !== getAddress(NETWORKS2[network].usdc)) {
46512
46551
  context.addIssue({
46513
46552
  code: "custom",
46514
46553
  path: ["networks", network, "usdc"],
@@ -46660,15 +46699,15 @@ function getDefaultConfig(source = process.env, options = {}) {
46660
46699
  const tasksEscrowFactoryOverrides = tasksFactoryOverridesFromEnv(source);
46661
46700
  if (requested.has("base") || requested.has(BASE_MAINNET_CAIP2)) {
46662
46701
  networks[BASE_MAINNET_CAIP2] = {
46663
- rpcUrl: source.BASE_RPC_URL?.trim() || NETWORKS[BASE_MAINNET_CAIP2].publicRpcUrl,
46664
- usdc: NETWORKS[BASE_MAINNET_CAIP2].usdc
46702
+ rpcUrl: source.BASE_RPC_URL?.trim() || NETWORKS2[BASE_MAINNET_CAIP2].publicRpcUrl,
46703
+ usdc: NETWORKS2[BASE_MAINNET_CAIP2].usdc
46665
46704
  };
46666
46705
  }
46667
46706
  const arcMainnetRpcUrl = source.ARC_RPC_URL?.trim();
46668
46707
  if (arcMainnetRpcUrl || requested.has("arc") || requested.has(ARC_MAINNET_CAIP2)) {
46669
46708
  networks[ARC_MAINNET_CAIP2] = {
46670
- rpcUrl: arcMainnetRpcUrl || NETWORKS[ARC_MAINNET_CAIP2].publicRpcUrl,
46671
- usdc: NETWORKS[ARC_MAINNET_CAIP2].usdc
46709
+ rpcUrl: arcMainnetRpcUrl || NETWORKS2[ARC_MAINNET_CAIP2].publicRpcUrl,
46710
+ usdc: NETWORKS2[ARC_MAINNET_CAIP2].usdc
46672
46711
  };
46673
46712
  }
46674
46713
  const arcTestnetRpcUrl = source.ARC_TESTNET_RPC_URL?.trim();
@@ -46680,14 +46719,14 @@ function getDefaultConfig(source = process.env, options = {}) {
46680
46719
  }
46681
46720
  networks[ARC_TESTNET_CAIP2] = {
46682
46721
  rpcUrl: arcTestnetRpcUrl,
46683
- usdc: NETWORKS[ARC_TESTNET_CAIP2].usdc
46722
+ usdc: NETWORKS2[ARC_TESTNET_CAIP2].usdc
46684
46723
  };
46685
46724
  }
46686
46725
  const solanaRpcUrl = source.SOLANA_RPC_URL?.trim();
46687
46726
  if (solanaRpcUrl || requested.has("solana") || requested.has(SOLANA_MAINNET_CAIP2)) {
46688
46727
  networks[SOLANA_MAINNET_CAIP2] = {
46689
- rpcUrl: solanaRpcUrl || NETWORKS[SOLANA_MAINNET_CAIP2].publicRpcUrl,
46690
- usdc: NETWORKS[SOLANA_MAINNET_CAIP2].usdc
46728
+ rpcUrl: solanaRpcUrl || NETWORKS2[SOLANA_MAINNET_CAIP2].publicRpcUrl,
46729
+ usdc: NETWORKS2[SOLANA_MAINNET_CAIP2].usdc
46691
46730
  };
46692
46731
  }
46693
46732
  return {
@@ -46745,21 +46784,21 @@ Run vapi init to write the new URLs to ${path}.`
46745
46784
  if (arcMainnetRpcUrl) {
46746
46785
  const existing = config2.networks[ARC_MAINNET_CAIP2];
46747
46786
  config2.networks[ARC_MAINNET_CAIP2] = {
46748
- ...existing ?? { usdc: NETWORKS[ARC_MAINNET_CAIP2].usdc },
46787
+ ...existing ?? { usdc: NETWORKS2[ARC_MAINNET_CAIP2].usdc },
46749
46788
  rpcUrl: arcMainnetRpcUrl
46750
46789
  };
46751
46790
  }
46752
46791
  if (arcTestnetRpcUrl) {
46753
46792
  const existing = config2.networks[ARC_TESTNET_CAIP2];
46754
46793
  config2.networks[ARC_TESTNET_CAIP2] = {
46755
- ...existing ?? { usdc: NETWORKS[ARC_TESTNET_CAIP2].usdc },
46794
+ ...existing ?? { usdc: NETWORKS2[ARC_TESTNET_CAIP2].usdc },
46756
46795
  rpcUrl: arcTestnetRpcUrl
46757
46796
  };
46758
46797
  }
46759
46798
  if (solanaRpcUrl) {
46760
46799
  config2.networks[SOLANA_MAINNET_CAIP2] = {
46761
46800
  rpcUrl: solanaRpcUrl,
46762
- usdc: config2.networks[SOLANA_MAINNET_CAIP2]?.usdc ?? NETWORKS[SOLANA_MAINNET_CAIP2].usdc
46801
+ usdc: config2.networks[SOLANA_MAINNET_CAIP2]?.usdc ?? NETWORKS2[SOLANA_MAINNET_CAIP2].usdc
46763
46802
  };
46764
46803
  }
46765
46804
  if (registryUrl) {
@@ -46772,7 +46811,7 @@ Run vapi init to write the new URLs to ${path}.`
46772
46811
  for (const [network, configured] of Object.entries(config2.networks)) {
46773
46812
  configured.rpcUrl = configured.rpcUrl.trim();
46774
46813
  configured.usdc = configured.usdc.trim();
46775
- if (isSolanaNetwork(network) && configured.usdc !== NETWORKS[SOLANA_MAINNET_CAIP2].usdc) {
46814
+ if (isSolanaNetwork(network) && configured.usdc !== NETWORKS2[SOLANA_MAINNET_CAIP2].usdc) {
46776
46815
  throw new Error(`Network ${network} must use canonical Solana mainnet USDC.`);
46777
46816
  }
46778
46817
  if (!configured.rpcUrl) delete config2.networks[network];
@@ -46828,14 +46867,14 @@ async function enableDefaultNetwork(network, path = getVapiPaths().config, sourc
46828
46867
  const config2 = await loadConfig(path, source);
46829
46868
  if (network === "solana") {
46830
46869
  config2.networks[SOLANA_MAINNET_CAIP2] = {
46831
- rpcUrl: source.SOLANA_RPC_URL?.trim() || NETWORKS[SOLANA_MAINNET_CAIP2].publicRpcUrl,
46832
- usdc: NETWORKS[SOLANA_MAINNET_CAIP2].usdc
46870
+ rpcUrl: source.SOLANA_RPC_URL?.trim() || NETWORKS2[SOLANA_MAINNET_CAIP2].publicRpcUrl,
46871
+ usdc: NETWORKS2[SOLANA_MAINNET_CAIP2].usdc
46833
46872
  };
46834
46873
  } else {
46835
46874
  const existing = config2.networks[ARC_MAINNET_CAIP2];
46836
46875
  config2.networks[ARC_MAINNET_CAIP2] = {
46837
- ...existing ?? { usdc: NETWORKS[ARC_MAINNET_CAIP2].usdc },
46838
- rpcUrl: source.ARC_RPC_URL?.trim() || NETWORKS[ARC_MAINNET_CAIP2].publicRpcUrl
46876
+ ...existing ?? { usdc: NETWORKS2[ARC_MAINNET_CAIP2].usdc },
46877
+ rpcUrl: source.ARC_RPC_URL?.trim() || NETWORKS2[ARC_MAINNET_CAIP2].publicRpcUrl
46839
46878
  };
46840
46879
  }
46841
46880
  await writeConfigFile(path, config2);
@@ -76900,7 +76939,7 @@ function createRunBudget(args) {
76900
76939
  import { mkdir as mkdir15, writeFile as writeFile8 } from "node:fs/promises";
76901
76940
  import { arch, platform, release } from "node:os";
76902
76941
  import { join as join13 } from "node:path";
76903
- var VAPI_CLIENT_VERSION = "0.9.0";
76942
+ var VAPI_CLIENT_VERSION = "0.9.2";
76904
76943
  async function createSupportReport(options) {
76905
76944
  const message = options.message.trim();
76906
76945
  if (!message) throw new Error("Support report message must not be empty.");
@@ -78022,6 +78061,7 @@ var searchEventSchema = external_exports.strictObject({
78022
78061
  source: external_exports.string().min(1),
78023
78062
  latencyMs: external_exports.number().nonnegative().finite(),
78024
78063
  count: external_exports.number().int().nonnegative(),
78064
+ dropped: external_exports.number().int().nonnegative().optional(),
78025
78065
  error: external_exports.string().optional()
78026
78066
  })
78027
78067
  ),
@@ -81257,7 +81297,7 @@ export {
81257
81297
  MARKETPLACE_KINDS,
81258
81298
  MARKETPLACE_RANKING_VERSION,
81259
81299
  MovementError,
81260
- NETWORKS,
81300
+ NETWORKS2 as NETWORKS,
81261
81301
  ONRAMP_FALLBACK_INSTRUCTIONS,
81262
81302
  ONRAMP_NETWORK,
81263
81303
  PASSPHRASE_ENVIRONMENT_VARIABLE,
@@ -81272,6 +81312,7 @@ export {
81272
81312
  SIGN_IN_WITH_X,
81273
81313
  SIWxError,
81274
81314
  SOLANA_DERIVATION_PATH,
81315
+ SOLANA_DEVNET_CAIP2,
81275
81316
  SOLANA_MAINNET_CAIP2,
81276
81317
  SOLANA_MAINNET_USDC,
81277
81318
  STATS_RANGES,
@@ -81395,6 +81436,7 @@ export {
81395
81436
  getNetworkDefinition,
81396
81437
  getVapiPaths,
81397
81438
  isCallableListing,
81439
+ isDiscoveryCatalogError,
81398
81440
  isEvmPaymentRequirements,
81399
81441
  isMirroredHit,
81400
81442
  isMissingFile,
@@ -81427,6 +81469,7 @@ export {
81427
81469
  lowerAccountCaps,
81428
81470
  marketplaceBadgeCodeSchema,
81429
81471
  marketplaceBadgeSchema,
81472
+ marketplaceDiscoveryEnvelopeSchema,
81430
81473
  marketplaceDiscoveryInputSchema,
81431
81474
  marketplaceDiscoveryPageSchema,
81432
81475
  marketplaceExecutionMethodSchema,