@billionsnetwork/x402-human-proof 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/node/cjs/declare.cjs +42 -0
  2. package/dist/node/cjs/declare.cjs.map +1 -0
  3. package/dist/node/cjs/hooks.cjs +198 -0
  4. package/dist/node/cjs/hooks.cjs.map +1 -0
  5. package/dist/node/cjs/index.cjs +493 -0
  6. package/dist/node/cjs/index.cjs.map +1 -0
  7. package/dist/node/cjs/server.cjs +469 -0
  8. package/dist/node/cjs/server.cjs.map +1 -0
  9. package/dist/node/cjs/types.cjs +19 -0
  10. package/dist/node/cjs/types.cjs.map +1 -0
  11. package/dist/node/cjs/utils.cjs +184 -0
  12. package/dist/node/cjs/utils.cjs.map +1 -0
  13. package/dist/node/cjs/verifier.cjs +102 -0
  14. package/dist/node/cjs/verifier.cjs.map +1 -0
  15. package/dist/node/esm/declare.js +15 -0
  16. package/dist/node/esm/declare.js.map +1 -0
  17. package/dist/node/esm/hooks.js +160 -0
  18. package/dist/node/esm/hooks.js.map +1 -0
  19. package/dist/node/esm/index.js +445 -0
  20. package/dist/node/esm/index.js.map +1 -0
  21. package/dist/node/esm/server.js +427 -0
  22. package/dist/node/esm/server.js.map +1 -0
  23. package/dist/node/esm/types.js +1 -0
  24. package/dist/node/esm/types.js.map +1 -0
  25. package/dist/node/esm/utils.js +145 -0
  26. package/dist/node/esm/utils.js.map +1 -0
  27. package/dist/node/esm/verifier.js +74 -0
  28. package/dist/node/esm/verifier.js.map +1 -0
  29. package/dist/types/declare.d.ts +17 -0
  30. package/dist/types/declare.d.ts.map +1 -0
  31. package/dist/types/hooks.d.ts +36 -0
  32. package/dist/types/hooks.d.ts.map +1 -0
  33. package/dist/types/index.d.ts +9 -0
  34. package/dist/types/index.d.ts.map +1 -0
  35. package/dist/types/server.d.ts +87 -0
  36. package/dist/types/server.d.ts.map +1 -0
  37. package/dist/types/types.d.ts +99 -0
  38. package/dist/types/types.d.ts.map +1 -0
  39. package/dist/types/utils.d.ts +40 -0
  40. package/dist/types/utils.d.ts.map +1 -0
  41. package/dist/types/verifier.d.ts +13 -0
  42. package/dist/types/verifier.d.ts.map +1 -0
  43. package/package.json +36 -0
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/declare.ts
21
+ var declare_exports = {};
22
+ __export(declare_exports, {
23
+ HUMAN_PROOF: () => HUMAN_PROOF,
24
+ declareHumanProofExtension: () => declareHumanProofExtension,
25
+ getSignatureTypes: () => getSignatureTypes
26
+ });
27
+ module.exports = __toCommonJS(declare_exports);
28
+ var HUMAN_PROOF = "human-proof";
29
+ function declareHumanProofExtension(options) {
30
+ return { _options: options, _type: "human-proof" };
31
+ }
32
+ function getSignatureTypes(network) {
33
+ if (network.startsWith("solana:")) return ["ed25519"];
34
+ return ["eip191"];
35
+ }
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ HUMAN_PROOF,
39
+ declareHumanProofExtension,
40
+ getSignatureTypes
41
+ });
42
+ //# sourceMappingURL=declare.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/declare.ts"],"sourcesContent":["import type { SignatureType } from './utils.js'\nimport type { DeclareHumanProofOptions, HumanProofDeclaration } from './types.js'\n\nexport const HUMAN_PROOF = 'human-proof'\n\n/**\n *\n * @example\n * extensions: declareHumanProofExtension({\n * statement: 'Verify your agent is backed by a verified human',\n * })\n */\nexport function declareHumanProofExtension(options: DeclareHumanProofOptions): HumanProofDeclaration {\n return { _options: options, _type: 'human-proof' }\n}\n\n/**\n * Returns the supported signature types for a given CAIP-2 network.\n * Solana uses ed25519 (SIWS); all EVM networks use eip191 (SIWE).\n */\nexport function getSignatureTypes(network: string): SignatureType[] {\n if (network.startsWith('solana:')) return ['ed25519']\n return ['eip191']\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,cAAc;AASpB,SAAS,2BAA2B,SAA0D;AACnG,SAAO,EAAE,UAAU,SAAS,OAAO,cAAc;AACnD;AAMO,SAAS,kBAAkB,SAAkC;AAClE,MAAI,QAAQ,WAAW,SAAS,EAAG,QAAO,CAAC,SAAS;AACpD,SAAO,CAAC,QAAQ;AAClB;","names":[]}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/hooks.ts
31
+ var hooks_exports = {};
32
+ __export(hooks_exports, {
33
+ HUMAN_PROOF_HEADER: () => HUMAN_PROOF_HEADER,
34
+ verifyHumanProofRequest: () => verifyHumanProofRequest
35
+ });
36
+ module.exports = __toCommonJS(hooks_exports);
37
+
38
+ // src/utils.ts
39
+ var import_viem = require("viem");
40
+ var import_bs58 = __toESM(require("bs58"), 1);
41
+ var import_tweetnacl = __toESM(require("tweetnacl"), 1);
42
+ function formatResources(resources) {
43
+ if (!resources?.length) return "";
44
+ const lines = resources.map((resource) => `- ${resource}`).join("\n");
45
+ return `
46
+ Resources:
47
+ ${lines}`;
48
+ }
49
+ function formatSIWEMessage(payload) {
50
+ const statementBlock = payload.statement ? `
51
+ ${payload.statement}
52
+ ` : "\n";
53
+ const expirationLine = payload.expirationTime ? `
54
+ Expiration Time: ${payload.expirationTime}` : "";
55
+ return `${payload.domain} wants you to sign in with your Ethereum account:
56
+ ${payload.address}${statementBlock}
57
+ URI: ${payload.uri ?? ""}
58
+ Version: ${payload.version}
59
+ Chain ID: ${payload.chainId}
60
+ Nonce: ${payload.nonce}
61
+ Issued At: ${payload.issuedAt}${expirationLine}${formatResources(payload.resources)}`;
62
+ }
63
+ function formatSIWSMessage(payload) {
64
+ const statementBlock = payload.statement ? `
65
+ ${payload.statement}
66
+ ` : "\n";
67
+ const expirationLine = payload.expirationTime ? `
68
+ Expiration Time: ${payload.expirationTime}` : "";
69
+ return `${payload.domain} wants you to sign in with your Solana account:
70
+ ${payload.address}${statementBlock}
71
+ URI: ${payload.uri ?? ""}
72
+ Version: ${payload.version}
73
+ Chain ID: ${payload.chainId}
74
+ Nonce: ${payload.nonce}
75
+ Issued At: ${payload.issuedAt}${expirationLine}${formatResources(payload.resources)}`;
76
+ }
77
+ function decodeBase58(input) {
78
+ return import_bs58.default.decode(input);
79
+ }
80
+ function parseHumanProofHeader(headerValue) {
81
+ const parsed = JSON.parse(headerValue);
82
+ if (!parsed || typeof parsed !== "object") {
83
+ throw new Error("Invalid header payload");
84
+ }
85
+ const payload = parsed;
86
+ if (!payload.address || !payload.signature || !payload.chainId || !payload.type) {
87
+ throw new Error("Missing required fields in header payload");
88
+ }
89
+ return payload;
90
+ }
91
+ async function validateHumanProofMessage(payload, resource) {
92
+ if (!payload.domain || !payload.version || !payload.nonce || !payload.issuedAt) {
93
+ return { valid: false, error: "invalid_message" };
94
+ }
95
+ if (!payload.uri || payload.uri !== resource) {
96
+ return { valid: false, error: "resource_mismatch" };
97
+ }
98
+ const issuedAtMillis = Date.parse(payload.issuedAt);
99
+ if (Number.isNaN(issuedAtMillis)) {
100
+ return { valid: false, error: "invalid_issued_at" };
101
+ }
102
+ if (payload.expirationTime) {
103
+ const expirationMillis = Date.parse(payload.expirationTime);
104
+ if (Number.isNaN(expirationMillis)) {
105
+ return { valid: false, error: "invalid_expiration_time" };
106
+ }
107
+ if (expirationMillis < Date.now()) {
108
+ return { valid: false, error: "message_expired" };
109
+ }
110
+ }
111
+ return { valid: true };
112
+ }
113
+ async function verifyHumanProofSignature(payload) {
114
+ if (payload.type === "eip191") {
115
+ if (!payload.signature.startsWith("0x")) {
116
+ return { valid: false, error: "invalid_signature" };
117
+ }
118
+ try {
119
+ const message = formatSIWEMessage(payload);
120
+ const signature = payload.signature;
121
+ const recovered = await (0, import_viem.recoverMessageAddress)({ message, signature });
122
+ if (recovered.toLowerCase() !== payload.address.toLowerCase()) {
123
+ return { valid: false, error: "invalid_signature" };
124
+ }
125
+ const publicKey = await (0, import_viem.recoverPublicKey)({ hash: (0, import_viem.hashMessage)(message), signature });
126
+ return { valid: true, address: payload.address, pubKey: publicKey };
127
+ } catch {
128
+ return { valid: false, error: "invalid_signature" };
129
+ }
130
+ }
131
+ if (payload.type === "ed25519") {
132
+ try {
133
+ const message = new TextEncoder().encode(formatSIWSMessage(payload));
134
+ const publicKey = decodeBase58(payload.address);
135
+ const signature = decodeBase58(payload.signature);
136
+ const valid = import_tweetnacl.default.sign.detached.verify(message, signature, publicKey);
137
+ if (!valid) return { valid: false, error: "invalid_signature" };
138
+ return { valid: true, address: payload.address, pubKey: import_bs58.default.encode(publicKey) };
139
+ } catch {
140
+ return { valid: false, error: "invalid_signature" };
141
+ }
142
+ }
143
+ return { valid: false, error: "invalid_signature_type" };
144
+ }
145
+
146
+ // src/hooks.ts
147
+ var import_js_iden3_core = require("@iden3/js-iden3-core");
148
+ var import_js_sdk = require("@0xpolygonid/js-sdk");
149
+ var HUMAN_PROOF_HEADER = "HUMAN-PROOF";
150
+ async function verifyHumanProofRequest(verifier, context) {
151
+ const { resource, humanProofHeader, onEvent } = context;
152
+ if (!humanProofHeader) {
153
+ return { allowed: false, reason: "missing_header" };
154
+ }
155
+ let payload;
156
+ try {
157
+ payload = parseHumanProofHeader(humanProofHeader);
158
+ } catch {
159
+ return { allowed: false, reason: "invalid_header" };
160
+ }
161
+ const validation = await validateHumanProofMessage(payload, resource);
162
+ if (!validation.valid) {
163
+ return { allowed: false, reason: validation.error ?? "invalid_message" };
164
+ }
165
+ const sigResult = await verifyHumanProofSignature(payload);
166
+ if (!sigResult.valid || !sigResult.address) {
167
+ return { allowed: false, reason: sigResult.error ?? "invalid_signature" };
168
+ }
169
+ const didType = (0, import_js_iden3_core.buildDIDType)(import_js_iden3_core.DidMethod.Iden3, import_js_iden3_core.Blockchain.Billions, import_js_iden3_core.NetworkId.Main);
170
+ const didString = (0, import_js_sdk.buildDIDFromEthAddress)(didType, sigResult.address).string();
171
+ const resolution = await verifier.lookupHuman(didString, payload.chainId);
172
+ if (!resolution) {
173
+ await onEvent?.({
174
+ type: "human_not_registered",
175
+ resource,
176
+ did: didString
177
+ });
178
+ return { allowed: false, reason: "not_registered", did: didString };
179
+ }
180
+ await onEvent?.({
181
+ type: "human_verified",
182
+ resource,
183
+ humanId: resolution.humanId,
184
+ verifiedAt: resolution.verifiedAt,
185
+ attestationId: resolution.attestationId,
186
+ humanDid: resolution.humanDid,
187
+ humanAddress: resolution.humanAddress,
188
+ agentDid: resolution.agentDid,
189
+ agentAddress: resolution.agentAddress
190
+ });
191
+ return { allowed: true, resolution, did: didString, chainId: payload.chainId };
192
+ }
193
+ // Annotate the CommonJS export names for ESM import in node:
194
+ 0 && (module.exports = {
195
+ HUMAN_PROOF_HEADER,
196
+ verifyHumanProofRequest
197
+ });
198
+ //# sourceMappingURL=hooks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks.ts","../../../src/utils.ts"],"sourcesContent":["import {\n parseHumanProofHeader,\n validateHumanProofMessage,\n verifyHumanProofSignature,\n} from './utils.js'\nimport type { HumanResolution, HumanProofEvent, PoUVerifier } from './types.js'\nimport { Blockchain, buildDIDType, DidMethod, NetworkId } from '@iden3/js-iden3-core'\nimport { buildDIDFromEthAddress } from '@0xpolygonid/js-sdk'\n\nexport const HUMAN_PROOF_HEADER = 'HUMAN-PROOF'\n\nexport type HumanProofRequestContext = {\n /** The resource URI being accessed (used to validate the CAIP-122 message). */\n resource: string\n /** Value of the HUMAN-PROOF request header, or null if absent. */\n humanProofHeader: string | null\n /** Optional callback fired on human_verified and human_not_registered events. */\n onEvent?: (event: HumanProofEvent) => void | Promise<void>\n}\n\nexport type HumanProofRequestResult =\n | { allowed: true; resolution: HumanResolution; did: string; chainId: string }\n | {\n allowed: false\n reason:\n | 'missing_header'\n | 'invalid_header'\n | 'invalid_message'\n | 'invalid_signature'\n | 'not_registered'\n | string\n did?: string\n humanId?: string\n }\n\n/**\n * Verify a HUMAN-PROOF request header against the PoU registry.\n *\n * Call this inside a request hook (BeforeVerifyHook or framework middleware)\n * to gate access based on human verification.\n *\n * Flow:\n * 1. Parse the CAIP-122 signed payload from the HUMAN-PROOF header\n * 2. Validate message fields (resource URI, nonce expiry)\n * 3. Verify the cryptographic signature (EVM eip191 or Solana ed25519)\n * 4. Resolve the wallet address to a HumanResolution via the on-chain registry\n * 5. Fire hook events\n */\nexport async function verifyHumanProofRequest(\n verifier: PoUVerifier,\n context: HumanProofRequestContext,\n): Promise<HumanProofRequestResult> {\n const { resource, humanProofHeader, onEvent } = context\n\n if (!humanProofHeader) {\n return { allowed: false, reason: 'missing_header' }\n }\n\n let payload\n try {\n payload = parseHumanProofHeader(humanProofHeader)\n } catch {\n return { allowed: false, reason: 'invalid_header' }\n }\n\n // Validate CAIP-122 message fields (URI match, nonce, expiry)\n const validation = await validateHumanProofMessage(payload, resource)\n if (!validation.valid) {\n return { allowed: false, reason: validation.error ?? 'invalid_message' }\n }\n\n // Verify cryptographic signature — handles both eip191 (SIWE) and ed25519 (SIWS)\n const sigResult = await verifyHumanProofSignature(payload)\n if (!sigResult.valid || !sigResult.address) {\n return { allowed: false, reason: sigResult.error ?? 'invalid_signature' }\n }\n\n const didType = buildDIDType(DidMethod.Iden3!, Blockchain.Billions!, NetworkId.Main!)\n const didString = buildDIDFromEthAddress(didType, sigResult.address!).string()\n // Resolve did → human via resolver\n const resolution = await verifier.lookupHuman(didString, payload.chainId)\n if (!resolution) {\n await onEvent?.({\n type: 'human_not_registered',\n resource,\n did: didString,\n })\n\n return { allowed: false, reason: 'not_registered', did: didString }\n }\n\n await onEvent?.({\n type: 'human_verified',\n resource,\n humanId: resolution.humanId,\n verifiedAt: resolution.verifiedAt,\n attestationId: resolution.attestationId,\n humanDid: resolution.humanDid,\n humanAddress: resolution.humanAddress,\n agentDid: resolution.agentDid,\n agentAddress: resolution.agentAddress, \n })\n\n return { allowed: true, resolution, did: didString, chainId: payload.chainId }\n}\n","import { recoverPublicKey, hashMessage, recoverMessageAddress } from 'viem'\nimport bs58 from 'bs58'\nimport nacl from 'tweetnacl'\nimport type { PaywallProvider } from '@x402/core/server'\nimport type { PaymentRequired } from '@x402/core/types'\n\nexport type SignatureType = 'eip191' | 'ed25519'\n\nexport type SupportedChain = {\n chainId: string\n type: SignatureType\n}\n\nexport type HumanProofExtensionInfo = {\n domain: string\n uri?: string\n version: string\n nonce: string\n issuedAt: string\n expirationTime?: string\n statement?: string\n resources?: string[]\n requiredAttestations: string[]\n}\n\nexport type HumanProofExtensionPayload = HumanProofExtensionInfo & {\n chainId: string\n type: SignatureType\n address: string\n signature: string\n}\n\ntype ValidationResult = {\n valid: boolean\n error?: string\n}\n\ntype SignatureVerificationResult = {\n valid: boolean\n address?: string\n pubKey?: string\n error?: string\n}\n\nfunction formatResources(resources?: string[]): string {\n if (!resources?.length) return ''\n const lines = resources.map(resource => `- ${resource}`).join('\\n')\n return `\\nResources:\\n${lines}`\n}\n\nfunction formatSIWEMessage(payload: HumanProofExtensionPayload): string {\n const statementBlock = payload.statement ? `\\n${payload.statement}\\n` : '\\n'\n const expirationLine = payload.expirationTime ? `\\nExpiration Time: ${payload.expirationTime}` : ''\n\n return (\n `${payload.domain} wants you to sign in with your Ethereum account:\\n` +\n `${payload.address}${statementBlock}\\n` +\n `URI: ${payload.uri ?? ''}\\n` +\n `Version: ${payload.version}\\n` +\n `Chain ID: ${payload.chainId}\\n` +\n `Nonce: ${payload.nonce}\\n` +\n `Issued At: ${payload.issuedAt}` +\n `${expirationLine}` +\n `${formatResources(payload.resources)}`\n )\n}\n\nfunction formatSIWSMessage(payload: HumanProofExtensionPayload): string {\n const statementBlock = payload.statement ? `\\n${payload.statement}\\n` : '\\n'\n const expirationLine = payload.expirationTime ? `\\nExpiration Time: ${payload.expirationTime}` : ''\n\n return (\n `${payload.domain} wants you to sign in with your Solana account:\\n` +\n `${payload.address}${statementBlock}\\n` +\n `URI: ${payload.uri ?? ''}\\n` +\n `Version: ${payload.version}\\n` +\n `Chain ID: ${payload.chainId}\\n` +\n `Nonce: ${payload.nonce}\\n` +\n `Issued At: ${payload.issuedAt}` +\n `${expirationLine}` +\n `${formatResources(payload.resources)}`\n )\n}\n\nfunction decodeBase58(input: string): Uint8Array {\n return bs58.decode(input)\n}\n\nexport function buildHumanProofSchema(): Record<string, unknown> {\n return {\n type: 'object',\n required: ['domain', 'version', 'nonce', 'issuedAt', 'chainId', 'type', 'address', 'signature', 'requiredAttestations'],\n properties: {\n domain: { type: 'string' },\n uri: { type: 'string' },\n version: { type: 'string' },\n nonce: { type: 'string' },\n issuedAt: { type: 'string' },\n expirationTime: { type: 'string' },\n statement: { type: 'string' },\n resources: { type: 'array', items: { type: 'string' } },\n chainId: { type: 'string' },\n type: { enum: ['eip191', 'ed25519'] },\n address: { type: 'string' },\n signature: { type: 'string' },\n requiredAttestations: { type: 'array', items: { type: 'string' }},\n },\n additionalProperties: true,\n }\n}\n\nexport function parseHumanProofHeader(headerValue: string): HumanProofExtensionPayload {\n const parsed = JSON.parse(headerValue) as unknown\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid header payload')\n }\n\n const payload = parsed as Partial<HumanProofExtensionPayload>\n if (!payload.address || !payload.signature || !payload.chainId || !payload.type) {\n throw new Error('Missing required fields in header payload')\n }\n\n return payload as HumanProofExtensionPayload\n}\n\nexport async function validateHumanProofMessage(\n payload: HumanProofExtensionPayload,\n resource: string,\n): Promise<ValidationResult> {\n if (!payload.domain || !payload.version || !payload.nonce || !payload.issuedAt) {\n return { valid: false, error: 'invalid_message' }\n }\n\n if (!payload.uri || payload.uri !== resource) {\n return { valid: false, error: 'resource_mismatch' }\n }\n\n const issuedAtMillis = Date.parse(payload.issuedAt)\n if (Number.isNaN(issuedAtMillis)) {\n return { valid: false, error: 'invalid_issued_at' }\n }\n\n if (payload.expirationTime) {\n const expirationMillis = Date.parse(payload.expirationTime)\n if (Number.isNaN(expirationMillis)) {\n return { valid: false, error: 'invalid_expiration_time' }\n }\n if (expirationMillis < Date.now()) {\n return { valid: false, error: 'message_expired' }\n }\n }\n\n return { valid: true }\n}\n\nexport async function verifyHumanProofSignature(\n payload: HumanProofExtensionPayload,\n): Promise<SignatureVerificationResult> {\n if (payload.type === 'eip191') {\n if (!payload.signature.startsWith('0x')) {\n return { valid: false, error: 'invalid_signature' }\n }\n try {\n const message = formatSIWEMessage(payload)\n const signature = payload.signature as `0x${string}`\n\n const recovered = await recoverMessageAddress({ message, signature })\n if (recovered.toLowerCase() !== payload.address.toLowerCase()) {\n return { valid: false, error: 'invalid_signature' }\n }\n\n const publicKey = await recoverPublicKey({ hash: hashMessage(message), signature })\n return { valid: true, address: payload.address, pubKey: publicKey }\n } catch {\n return { valid: false, error: 'invalid_signature' }\n }\n }\n\n if (payload.type === 'ed25519') {\n try {\n const message = new TextEncoder().encode(formatSIWSMessage(payload))\n const publicKey = decodeBase58(payload.address)\n const signature = decodeBase58(payload.signature)\n\n const valid = nacl.sign.detached.verify(message, signature, publicKey)\n if (!valid) return { valid: false, error: 'invalid_signature' }\n return { valid: true, address: payload.address, pubKey: bs58.encode(publicKey) }\n } catch {\n return { valid: false, error: 'invalid_signature' }\n }\n }\n\n return { valid: false, error: 'invalid_signature_type' }\n}\n\nconst DEFAULT_PAYWALL_HTML =\n \"<html><body>\" +\n \"<h1>Payment Required</h1>\" +\n \"<p>Please complete the payment to access this resource.</p>\" +\n \"<p>The payment depends on verified-agent-identity plugin. \" +\n \"That can be downloaded from: \" +\n '<a href=\"https://clawhub.ai/obrezhniev/verified-agent-identity\">clawhub.ai</a> ' +\n '<a href=\"https://skills.sh/billionsnetwork/verified-agent-identity/verified-agent-identity\">skills.sh</a>' +\n \"</p></body></html>\"\n\nexport function paywallInstructions(html?: string): PaywallProvider {\n return new (class implements PaywallProvider {\n public generateHtml(_: PaymentRequired): string {\n return html ?? DEFAULT_PAYWALL_HTML\n }\n })()\n}\n"],"mappings":"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","names":["bs58","nacl","bs58"]}