@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.
- package/dist/api-key.js.map +1 -1
- package/dist/backup.js.map +1 -1
- package/dist/call-contracts-wire.d.ts +48 -12
- package/dist/call-contracts-wire.d.ts.map +1 -1
- package/dist/call-contracts.d.ts +7 -1
- package/dist/call-contracts.d.ts.map +1 -1
- package/dist/cloud-backup.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1000 -957
- package/dist/index.js.map +3 -3
- package/dist/marketplace-contracts.d.ts +22 -10
- package/dist/marketplace-contracts.d.ts.map +1 -1
- package/dist/router-client.js +1 -1
- package/dist/router-client.js.map +1 -1
- package/dist/searches.d.ts +1 -0
- package/dist/searches.d.ts.map +1 -1
- package/dist/secrets.js.map +1 -1
- package/dist/support-report.d.ts +1 -1
- package/dist/tasks/chain-error.d.ts.map +1 -1
- package/dist/tasks/chain-port.d.ts +2 -0
- package/dist/tasks/chain-port.d.ts.map +1 -1
- package/dist/tasks/chain.d.ts.map +1 -1
- package/dist/tasks/client.d.ts.map +1 -1
- package/dist/tasks/index.d.ts +1 -0
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/operation-support.d.ts.map +1 -1
- package/dist/tasks/operations.d.ts +56 -1
- package/dist/tasks/operations.d.ts.map +1 -1
- package/dist/tasks/types.d.ts +5 -5
- package/dist/tasks/types.d.ts.map +1 -1
- package/dist/tasks/wait.d.ts +18 -0
- package/dist/tasks/wait.d.ts.map +1 -0
- package/dist/tasks.js +247 -45
- package/dist/tasks.js.map +3 -3
- package/dist/x402-networks.d.ts +1 -0
- package/dist/x402-networks.d.ts.map +1 -1
- 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/
|
|
39131
|
-
|
|
39132
|
-
|
|
39133
|
-
|
|
39134
|
-
|
|
39135
|
-
|
|
39136
|
-
|
|
39137
|
-
|
|
39138
|
-
|
|
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
|
-
|
|
39141
|
-
|
|
39142
|
-
|
|
39143
|
-
|
|
39144
|
-
|
|
39145
|
-
|
|
39146
|
-
|
|
39147
|
-
|
|
39148
|
-
|
|
39149
|
-
|
|
39150
|
-
|
|
39151
|
-
|
|
39152
|
-
|
|
39153
|
-
|
|
39154
|
-
|
|
39155
|
-
|
|
39156
|
-
|
|
39157
|
-
|
|
39158
|
-
|
|
39159
|
-
|
|
39160
|
-
|
|
39161
|
-
|
|
39162
|
-
|
|
39163
|
-
|
|
39164
|
-
|
|
39165
|
-
|
|
39166
|
-
|
|
39167
|
-
|
|
39168
|
-
|
|
39169
|
-
|
|
39170
|
-
|
|
39171
|
-
|
|
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
|
-
|
|
39379
|
-
|
|
39380
|
-
|
|
39381
|
-
|
|
39382
|
-
|
|
39383
|
-
|
|
39384
|
-
|
|
39385
|
-
|
|
39386
|
-
|
|
39387
|
-
|
|
39388
|
-
}
|
|
39389
|
-
|
|
39390
|
-
|
|
39391
|
-
|
|
39392
|
-
|
|
39393
|
-
|
|
39394
|
-
|
|
39395
|
-
|
|
39396
|
-
|
|
39397
|
-
|
|
39398
|
-
|
|
39399
|
-
|
|
39400
|
-
|
|
39401
|
-
|
|
39402
|
-
|
|
39403
|
-
|
|
39404
|
-
|
|
39405
|
-
|
|
39406
|
-
|
|
39407
|
-
|
|
39408
|
-
|
|
39409
|
-
|
|
39410
|
-
|
|
39411
|
-
|
|
39412
|
-
|
|
39413
|
-
|
|
39414
|
-
|
|
39415
|
-
|
|
39416
|
-
|
|
39417
|
-
|
|
39418
|
-
|
|
39419
|
-
|
|
39420
|
-
|
|
39421
|
-
|
|
39422
|
-
|
|
39423
|
-
}
|
|
39424
|
-
|
|
39425
|
-
|
|
39426
|
-
|
|
39427
|
-
|
|
39428
|
-
|
|
39429
|
-
|
|
39430
|
-
|
|
39431
|
-
|
|
39432
|
-
|
|
39433
|
-
|
|
39434
|
-
|
|
39435
|
-
|
|
39436
|
-
|
|
39437
|
-
|
|
39438
|
-
|
|
39439
|
-
|
|
39440
|
-
|
|
39441
|
-
|
|
39442
|
-
|
|
39443
|
-
|
|
39444
|
-
|
|
39445
|
-
|
|
39446
|
-
|
|
39447
|
-
|
|
39448
|
-
|
|
39449
|
-
|
|
39450
|
-
|
|
39451
|
-
|
|
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
|
-
|
|
39469
|
-
|
|
39470
|
-
|
|
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
|
|
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":
|
|
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,
|
|
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
|
-
[
|
|
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
|
-
|
|
44582
|
-
|
|
44583
|
-
|
|
44584
|
-
|
|
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
|
-
|
|
44588
|
-
|
|
44589
|
-
|
|
44590
|
-
|
|
44591
|
-
|
|
44592
|
-
|
|
44593
|
-
|
|
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
|
-
|
|
44609
|
-
|
|
44610
|
-
|
|
44611
|
-
|
|
44612
|
-
|
|
44613
|
-
|
|
44614
|
-
|
|
44615
|
-
|
|
44616
|
-
|
|
44617
|
-
|
|
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
|
-
|
|
44630
|
-
|
|
44631
|
-
|
|
44632
|
-
|
|
44633
|
-
return
|
|
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
|
|
44645
|
-
const
|
|
44646
|
-
|
|
44647
|
-
|
|
44648
|
-
|
|
44649
|
-
|
|
44650
|
-
|
|
44651
|
-
|
|
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
|
-
|
|
44655
|
-
|
|
44656
|
-
return
|
|
44657
|
-
|
|
44658
|
-
|
|
44659
|
-
|
|
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
|
|
44668
|
-
const
|
|
44669
|
-
|
|
44670
|
-
|
|
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
|
|
44678
|
-
return
|
|
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 !==
|
|
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(
|
|
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() ||
|
|
46664
|
-
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 ||
|
|
46671
|
-
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:
|
|
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 ||
|
|
46690
|
-
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:
|
|
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:
|
|
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 ??
|
|
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 !==
|
|
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() ||
|
|
46832
|
-
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:
|
|
46838
|
-
rpcUrl: source.ARC_RPC_URL?.trim() ||
|
|
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.
|
|
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,
|