{"id":"0256e381-81c2-4286-9bf9-ad2e97a50f0e","entityType":"agent","slug":"clawhub-billionsnetwork-identity","name":"Verified Agent Identity","canonicalUrl":"https://www.xpersona.co/agent/clawhub-billionsnetwork-identity","canonicalPath":"/agent/clawhub-billionsnetwork-identity","generatedAt":"2026-10-11T07:35:58.662Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":null},"description":"Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17bfxbf7jb6sh7f174z5vmrws85y08c:identity","sourceUrl":"https://clawhub.ai/billionsnetwork/identity","homepage":"https://clawhub.ai/billionsnetwork/skills/identity","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/billionsnetwork/identity","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/billionsnetwork/skills/identity","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Verified Agent Identity technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":null},"stars":null,"forks":null,"downloads":1169,"packageName":null,"latestVersion":"2.0.4","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:46:17.766Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T03:46:17.839Z","lastCrawledAt":"2026-10-11T03:46:17.766Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T03:46:17.766Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.4","createdAt":"2026-05-18T09:34:42.234Z","changelog":"Identity Skill 2.0.4 - Clarified the identity setup workflow: after creating a new Ethereum identity, you must run `linkHumanToAgent.js` before proceeding. - Updated guardrails to require both identity creation and explicit human owner linking before continuing with any operation. - Improved documentation for the identity existence check and the next steps in SKILL.md. - No changes were made to security model or environment variable options.","fileCount":32,"zipByteSize":69413},{"version":"2.0.3","createdAt":"2026-05-14T14:44:44.670Z","changelog":"- Internal update to scripts/buildX402Payment.js and package-lock.json. - No user-facing changes or modifications to SKILL.md content.","fileCount":31,"zipByteSize":63939},{"version":"2.0.2","createdAt":"2026-05-13T12:08:10.166Z","changelog":"- Documentation updates for clarity and guidance in SKILL.md and related files. - Improved instructions and formatting in reference documentation. - No changes to business logic or APIs.","fileCount":31,"zipByteSize":63439},{"version":"2.0.1","createdAt":"2026-05-13T11:45:49.806Z","changelog":"## verified-agent-identity 2.0.1 - Documentation updated in `reference/x402/SKILL.md`. - Minor adjustments to `scripts/buildX402Payment.js` script. - No breaking changes; usage, guardrails, and setup instructions remain unchanged.","fileCount":31,"zipByteSize":63130},{"version":"2.0.0","createdAt":"2026-05-13T11:04:20.468Z","changelog":"**2.0.0 summary:** Major upgrade. Skill now supports both agent identity management and x402 Payment Required flows via a modular reference system. - Skill split into two operational references: `identity` and `x402` (402 Payment Required). - All users must now consult and load the appropriate SKILL.md in `reference/identity/` or `reference/x402/` before running scripts. - Added support for handling and signing HTTP 402 Payment Required flows with a new `buildX402Payment.js` script. - Refactored shared logic into utility modules for improved maintainability. - Updated critical guardrails and explicit instructions for identity checks, error handling, and security practices. - Removed legacy flat utility files; new code structure enhances separation of concerns and clarity.","fileCount":31,"zipByteSize":63176},{"version":"1.0.0","createdAt":"2026-05-11T19:09:14.765Z","changelog":"Initial release of verified-agent-identity skill for decentralized agent identity using Billions Network. - Lets agents create, manage, and link decentralized identities (DIDs) to human owners using Billions ERC-8004 and Attestation Registries. - Provides CLI scripts for identity creation, challenge generation, signing, verification, and linking human-to-agent identities. - Enforces strict security/guardrails (no manual file manipulation, always check for identity before linking, halt on script failure). - All sensitive identity data stored in `$HOME/.openclaw/billions` for compatibility and security. - Supports authentication and verification workflows using iden3 self-sovereign identity protocol.","fileCount":24,"zipByteSize":53070}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17bfxbf7jb6sh7f174z5vmrws85y08c:identity","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17bfxbf7jb6sh7f174z5vmrws85y08c:identity` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/billionsnetwork/identity before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T07:35:58.657Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-billionsnetwork-identity/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":null},"readme":"Skill: Verified Agent Identity\n\nOwner: billionsnetwork\n\nSummary: Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify...\n\nTags: latest:2.0.4\n\nVersion history:\n\nv2.0.4 | 2026-05-18T09:34:42.234Z | auto\n\nIdentity Skill 2.0.4\n\n- Clarified the identity setup workflow: after creating a new Ethereum identity, you must run `linkHumanToAgent.js` before proceeding.\n- Updated guardrails to require both identity creation and explicit human owner linking before continuing with any operation.\n- Improved documentation for the identity existence check and the next steps in SKILL.md.\n- No changes were made to security model or environment variable options.\n\nv2.0.3 | 2026-05-14T14:44:44.670Z | auto\n\n- Internal update to scripts/buildX402Payment.js and package-lock.json.\n- No user-facing changes or modifications to SKILL.md content.\n\nv2.0.2 | 2026-05-13T12:08:10.166Z | auto\n\n- Documentation updates for clarity and guidance in SKILL.md and related files.\n- Improved instructions and formatting in reference documentation.\n- No changes to business logic or APIs.\n\nv2.0.1 | 2026-05-13T11:45:49.806Z | auto\n\n## verified-agent-identity 2.0.1\n\n- Documentation updated in `reference/x402/SKILL.md`.\n- Minor adjustments to `scripts/buildX402Payment.js` script.\n- No breaking changes; usage, guardrails, and setup instructions remain unchanged.\n\nv2.0.0 | 2026-05-13T11:04:20.468Z | auto\n\n**2.0.0 summary:** Major upgrade. Skill now supports both agent identity management and x402 Payment Required flows via a modular reference system.\n\n- Skill split into two operational references: `identity` and `x402` (402 Payment Required).\n- All users must now consult and load the appropriate SKILL.md in `reference/identity/` or `reference/x402/` before running scripts.\n- Added support for handling and signing HTTP 402 Payment Required flows with a new `buildX402Payment.js` script.\n- Refactored shared logic into utility modules for improved maintainability.\n- Updated critical guardrails and explicit instructions for identity checks, error handling, and security practices.\n- Removed legacy flat utility files; new code structure enhances separation of concerns and clarity.\n\nv1.0.0 | 2026-05-11T19:09:14.765Z | user\n\nInitial release of verified-agent-identity skill for decentralized agent identity using Billions Network.\n\n- Lets agents create, manage, and link decentralized identities (DIDs) to human owners using Billions ERC-8004 and Attestation Registries.\n- Provides CLI scripts for identity creation, challenge generation, signing, verification, and linking human-to-agent identities.\n- Enforces strict security/guardrails (no manual file manipulation, always check for identity before linking, halt on script failure).\n- All sensitive identity data stored in `$HOME/.openclaw/billions` for compatibility and security.\n- Supports authentication and verification workflows using iden3 self-sovereign identity protocol.\n\nArchive index:\n\nArchive v2.0.4: 32 files, 69413 bytes\n\nFiles: README.md (8190b), reference/identity/SKILL.md (4669b), reference/x402/SKILL.md (14493b), scripts/buildX402Payment.js (13748b), scripts/createNewEthereumIdentity.js (1835b), scripts/generateChallenge.js (742b), scripts/getDidDocument.js (593b), scripts/getIdentities.js (521b), scripts/linkHumanToAgent.js (1746b), scripts/manualLinkHumanToAgent.js (675b), scripts/package-lock.json (130122b), scripts/package.json (686b), scripts/shared/attestation.js (2230b), scripts/shared/bootstrap.js (4099b), scripts/shared/constants.js (1871b), scripts/shared/scopes.js (1036b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils/auth.js (2750b), scripts/shared/utils/cli.js (1240b), scripts/shared/utils/did.js (1068b), scripts/shared/utils/index.js (1264b), scripts/signChallenge.js (2042b), scripts/verifySignature.js (1930b), SECURITY.md (8221b), skill-card.md (2898b), SKILL.md (3733b), _meta.json (127b)\n\nFile v2.0.4:reference/identity/SKILL.md\n\n# Identity Reference\n\nManage decentralized identities (DIDs) on the Billions Network — create, list, link to a human owner, and verify ownership.\n\n## When to Use\n\n- You need to create a new agent identity.\n- You need to link your agent identity to a human owner.\n- You need to sign a challenge to prove identity ownership.\n- You need to verify someone else's identity.\n- You need to list existing local identities.\n\n## Scripts\n\n### createNewEthereumIdentity.js\n\n**Command**: `node scripts/createNewEthereumIdentity.js [--key <privateKeyHex>]`\n\nCreates a new identity on the Billions Network. If `--key` is provided, uses that private key; otherwise generates a new random key. The created identity is automatically set as default.\n\n```bash\n# Generate a new random identity\nnode scripts/createNewEthereumIdentity.js\n\n# Create identity from existing private key\nnode scripts/createNewEthereumIdentity.js --key 0x1234567890abcdef...\n```\n\n**Output**: DID string (e.g., `did:iden3:billions:main:2VmAk7fGHQP5FN2jZ8X9Y3K4W6L1M...`)\n\n---\n\n### getIdentities.js\n\n**Command**: `node scripts/getIdentities.js`\n\nLists all DID identities stored locally. **Always run this before any signing or linking operation.**\n\n```bash\nnode scripts/getIdentities.js\n```\n\n**Output**: JSON array of identity entries\n\n```json\n[\n  {\n    \"did\": \"did:iden3:billions:main:2VmAk...\",\n    \"publicKeyHex\": \"0x04abc123...\",\n    \"isDefault\": true\n  }\n]\n```\n\n---\n\n### linkHumanToAgent.js\n\n**Command**: `node scripts/linkHumanToAgent.js --challenge <challenge> [--did <did>]`\n\nSigns the challenge and links a human user to the agent's DID by creating a verification request. Uses the Billions ERC-8004 Registry (agent registration) and the Billions Attestation Registry (ownership attestation after verifying human uniqueness).\n\n- `--challenge` — (required) Challenge to sign. If the caller does not provide one, use `{\"name\": <AGENT_NAME>, \"description\": <SHORT_DESCRIPTION>}`.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"AI persona\"}'\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### generateChallenge.js\n\n**Command**: `node scripts/generateChallenge.js --did <did>`\n\nGenerates a random challenge for identity verification. Stores the challenge in `$HOME/.openclaw/billions/challenges.json`.\n\n```bash\nnode scripts/generateChallenge.js --did did:iden3:billions:main:2VmAk...\n```\n\n**Output**: Challenge string (e.g., `8472951360`)\n\n---\n\n### signChallenge.js\n\n**Command**: `node scripts/signChallenge.js --challenge <challenge> [--did <did>]`\n\nSigns a challenge with a DID's private key to prove identity ownership and sends the JWS token.\n\n- `--challenge` — (required) Challenge to sign.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/signChallenge.js --challenge 8472951360\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### verifySignature.js\n\n**Command**: `node scripts/verifySignature.js --did <did> --token <token>`\n\nVerifies a signed challenge to confirm DID ownership.\n\n```bash\nnode scripts/verifySignature.js --did did:iden3:billions:main:2VmAk... --token eyJhbGciOiJFUzI1NkstUi...\n```\n\n**Output**: `Signature verified successfully` (on success) or error message (on failure)\n\n---\n\n## Workflows\n\n### Link Your Agent Identity to an Owner\n\n1. Check for existing identity: `node scripts/getIdentities.js`\n   - If none exists → `node scripts/createNewEthereumIdentity.js`\n2. Run: `node scripts/linkHumanToAgent.js --challenge <challenge_value>`\n   - Use caller's challenge if provided, otherwise use `{\"name\": <AGENT_NAME>, \"description\": <SHORT_DESCRIPTION>}`.\n3. Return the result to the caller.\n\n**Example Conversation:**\n\n```\nUser: \"Link your agent identity to me\"\nAgent: [runs getIdentities.js, confirms identity exists]\nAgent: [runs linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"Coding assistant\"}']\nAgent: \"Done — here's the verification link: ...\"\n```\n\n### Verify Someone Else's Identity\n\n1. Ask: \"Please provide your DID to start verification.\"\n2. Generate challenge: `node scripts/generateChallenge.js --did <user_did>`\n3. Ask user to sign: \"Please sign this challenge: `<challenge_value>`\"\n4. Verify: `node scripts/verifySignature.js --did <user_did> --token <user_token>`\n5. Report result.\n\n**Example Conversation:**\n\n```\nAgent: \"Please provide your DID to start verification.\"\nUser: \"My DID is did:iden3:billions:main:2VmAk...\"\nAgent: [runs generateChallenge.js] → \"Please sign this challenge: 789012\"\nUser: [provides token]\nAgent: [runs verifySignature.js] → \"Identity verified. You are confirmed as owner of that DID.\"\n```\n\nFile v2.0.4:reference/x402/SKILL.md\n\n# x402 Payment Reference\n\nHandle `402 Payment Required` HTTP responses by executing payment and fetching the protected resource.\n\n## When to Use\n\n- The user wants to access a resource that returns **HTTP 402 Payment Required** with a `PAYMENT-REQUIRED` header — either known in advance or discovered by a previous attempt.\n- Do not pre-fetch the resource yourself to \"check\" — phase 1 of the script does the fetch.\n\n## Script\n\n### buildX402Payment.js\n\n**Command (phase 1 — discover)**: `node scripts/buildX402Payment.js --resource <url> [--did <did>]`\n**Command (phase 2 — execute)**: `node scripts/buildX402Payment.js --paymentRequiredFilePath <path> --paymentHash <hash> [--did <did>]`\n**Hint**: **NEVER reuse or cache a previous response from this script.** Every invocation produces unique, time-sensitive output (nonces, signatures, payment tokens). Always execute the script again to get a fresh result — even if the arguments are identical to a prior call.\n\nExecutes the x402 payment flow in two strictly separated phases.\n\n- **Phase 1** (`--resource` only): the script fetches the resource, expects a `402` response with a `PAYMENT-REQUIRED` header, caches the decoded challenge to a temp file named by its SHA-256 hash, and returns the available payment options together with the cached file path. It never signs a payment.\n- **Phase 2** (`--paymentRequiredFilePath` + `--paymentHash`): the script reads the cached challenge file, looks up the chosen payment option by its `--paymentHash`, signs the payment, sends the `PAYMENT-SIGNATURE` header to the resource, and returns the result.\n\n- `--resource` — (phase 1 only) The URL of the protected resource. The script fetches it and expects HTTP 402 with a `PAYMENT-REQUIRED` header. If the response is any other status, or the header is missing, the script returns status `failed`. Cannot be combined with `--paymentRequiredFilePath` or `--paymentHash`.\n- `--paymentRequiredFilePath` — (phase 2 only) Absolute path to the cached payment-required JSON file returned by phase 1. Must be combined with `--paymentHash`. Mutually exclusive with `--resource`.\n- `--paymentHash` — (phase 2 only, required) The SHA-256 hash of the chosen payment option from phase 1. Always required on phase 2, even when only one option was offered. Cannot be passed with `--resource`.\n- `--did` — (optional) The DID of the signer. Omit unless the user has explicitly asked to pay from a specific DID — the script falls back to the default DID from `getIdentities.js`, which is correct for normal use. Do not prompt the user for a DID on your own.\n\nYou **must** pick exactly one phase per invocation. Passing `--resource` together with `--paymentHash` (or with `--paymentRequiredFilePath`) is rejected.\n\n---\n\n## Output\n\nThe script always outputs JSON to stdout with a top-level `status` of `success`, `failed`, or `input_required`. See [Handling output](#handling-output) below for the action to take on each.\n\n---\n\n## Workflow\n\n### 1. Trigger\n\nUse this skill whenever the user wants to access a resource you know (or strongly suspect) is gated by `402 Payment Required` with a `PAYMENT-REQUIRED` header.\n\n**Do not fetch the resource yourself first.** `buildX402Payment.js` performs the HTTP request in phase 1, parses the header, and caches the challenge — making your own fetch beforehand is wasted work and may consume a one-shot challenge.\n\n### 2. Ensure identity exists\n\nRun `node scripts/getIdentities.js`. If no identity is configured, create one first (see `reference/identity/SKILL.md`).\n\n### 3. First call — discover payment options (phase 1)\n\n```bash\nnode scripts/buildX402Payment.js \\\n  --resource 'https://api.example.com/weather'\n```\n\nThe script fetches the URL, decodes the `PAYMENT-REQUIRED` header, caches it to a temp file, and **never signs a payment on the first call**. Even when only one option is offered, it returns the list and waits for the user to confirm by selecting a `paymentHash`.\n\nThe script outputs `status: \"input_required\"` with three top-level fields in `data`:\n\n- `resource` — describes the protected resource the user is paying for:\n  - `resource.url` — the URL of the protected resource.\n  - `resource.description` — a human-readable description of what the resource provides.\n- `paymentOptions` — the list of payment options. Each option includes:\n  - `hash` — the payment hash (use as `--paymentHash` in the next call)\n  - `amount` — the payment amount\n  - `asset` — the asset name (e.g., \"USDC\") or contract address\n  - `network` — the network identifier (e.g., \"eip155:84532\")\n  - `requiredAttestations` — informational list of attestation schema IDs that this payment type requires in general; may be non-empty even when the user already holds all of them — **do not use this field to decide whether to block the payment**\n  - `hasAllAttestations` — `true` if the user already holds every required attestation and the payment can proceed; `false` if some are missing\n  - `attestationLinks` — verification URLs the user must complete to obtain **missing** attestations; empty when `hasAllAttestations` is `true`\n- `paymentRequiredFilePath` — absolute path to the cached challenge file. Pass this back via `--paymentRequiredFilePath` on the second call. The file lives in the OS temp directory and is named by the SHA-256 hash of the full challenge content.\n\n**Present the options to the user.** Always start by showing `resource.url` and `resource.description` so the user knows **what** they are paying for. Then show each payment option's amount, asset, network, and whether attestations are required. Ask the user to choose one payment option or decline payment.\n\nIf the user declines, do **not** run phase 2. Report that the resource is unavailable without payment and stop.\n\n> **CRITICAL: Formatting `amount` for display (UI only)**\n>\n> The `amount` field is a raw on-chain integer in the asset's smallest unit. **Never show it to the user as-is** — always convert to a human-readable price by dividing by `10^decimals`, where `decimals` depends on the asset **and the network**.\n>\n> | Asset       | Network                                          | Decimals | Divisor              |\n> | ----------- | ------------------------------------------------ | -------- | -------------------- |\n> | USDC / EURC | Ethereum, Polygon, Arbitrum, Optimism, Base      | 6        | 10⁶ = 1 000 000      |\n> | USDT        | Ethereum, Polygon, Arbitrum                      | 6        | 10⁶ = 1 000 000      |\n> | USDT        | BNB Smart Chain (BEP-20)                         | 18       | 10¹⁸                 |\n>\n> Examples:\n> - `amount: \"1000000\"` USDC on Base → **$1.00** (or €1.00 for EURC)\n> - `amount: \"1000000000000000000\"` USDT on BNB Smart Chain → **$1.00**\n>\n> This conversion is **for UI/presentation only**. Always pass the original raw `hash` value back to phase 2 via `--paymentHash` — never round, scale, or modify any field you forward to the script.\n\n> **CRITICAL: Reading attestation status**\n>\n> Use only `hasAllAttestations` + `attestationLinks` to decide whether a payment is blocked. **Never use `requiredAttestations` alone** — it lists schema IDs informationally and can be non-empty even when the user already holds everything.\n>\n> | `hasAllAttestations` | `attestationLinks` | What it means                                                       |\n> | -------------------- | ------------------ | ------------------------------------------------------------------- |\n> | `true`               | empty              | User holds all attestations — payment can proceed immediately.      |\n> | `false`              | non-empty          | User is missing attestations — show every link as-is and wait.      |\n>\n> When `attestationLinks` is non-empty: show every link verbatim, do not open/resolve them yourself, do not complete attestations on the user's behalf, and do not hide options that require attestations.\n\n### 4. Second call — execute chosen payment (phase 2)\n\nThis step is **always required** — there is no fast-path that skips it, even when only one payment option was offered. Once the user selects (or confirms) a payment, call the script again with the cached file path and the chosen `--paymentHash`:\n\n```bash\nnode scripts/buildX402Payment.js \\\n  --paymentRequiredFilePath '<paymentRequiredFilePath from phase 1>' \\\n  --paymentHash '<hash of chosen payment>'\n```\n\n**Do not pass `--resource` here.** Phase 2 reads the cached challenge from `--paymentRequiredFilePath` and looks up the payment by `--paymentHash`; combining either with `--resource` is rejected. If the server has rotated the challenge in the meantime, the signed payment will be rejected and the script will report `data.newPaymentRequired` — re-run phase 1 to discover the new challenge.\n\nCheck the output `status` and follow the rules in [Handling output](#handling-output) below.\n\n---\n\n## Handling output\n\nAfter **any** invocation (phase 1 or phase 2), branch on `status`:\n\n### `status: \"success\"`\n\nThe resource was fetched. Use `data` as the response body and report it to the user.\n\n### `status: \"failed\"`\n\nShow `message` to the user and stop. Do not auto-retry. If the user explicitly asks to try again after resolving the issue, you may re-run phase 1 from the top.\n\n### `status: \"input_required\"`\n\nDo **not** make your own HTTP request to the resource. Inspect `data` and act per the sub-type:\n\n| `data` field                | Action                                                                                                                                                                                                                  |\n| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `data.attestationsRequired` | Show every URL in `data.attestationLinks` to the user verbatim. Wait for the user to **explicitly confirm** they completed the attestation, then re-run phase 2 with the same `--paymentRequiredFilePath`/`--paymentHash` — the script will re-check. Do not poll or guess that they are done. |\n| `data.maxUseExceeded`       | The chosen payment exceeded its allowed uses. Do not retry the same hash. Go back to step 3's option list, ask the user to pick a different one, and run phase 2 again (reuse the same `--paymentRequiredFilePath`).    |\n| `data.newPaymentRequired`   | Server rotated the challenge. Re-enter phase 1 with `--resource <same url>` — a new file path will be cached — then loop back to step 3. Continue until you reach `success` or `failed`.                                |\n\n---\n\n## Examples\n\n### Standard payment flow (user confirmation required)\n\n```\nUser: \"Get me the weather from https://api.example.com/weather — it's a paid endpoint.\"\n\nAgent: [runs getIdentities.js — confirms identity exists]\nAgent: [runs buildX402Payment.js --resource 'https://api.example.com/weather']\n       → { \"status\": \"input_required\", \"data\": {\n            \"resource\": { \"url\": \"https://api.example.com/weather\", \"description\": \"Weather data\" },\n            \"paymentOptions\": [\n              { \"hash\": \"a1b2c3...\", \"amount\": \"10000\", \"asset\": \"USDC\", \"network\": \"eip155:84532\",\n                \"requiredAttestations\": [], \"hasAllAttestations\": true, \"attestationLinks\": [] },\n              { \"hash\": \"d4e5f6...\", \"amount\": \"6000\", \"asset\": \"USDC\", \"network\": \"eip155:84532\",\n                \"requiredAttestations\": [\"0xca35...\"], \"hasAllAttestations\": false,\n                \"attestationLinks\": [\"https://wallet.billions.network#request_uri=...\"] }\n            ],\n            \"paymentRequiredFilePath\": \"/tmp/9f3c....json\" }}\n\nAgent: \"You are about to pay for: Weather data (https://api.example.com/weather).\n        There are 2 payment options:\n        1) 10000 USDC on eip155:84532 — no attestations required\n        2) 6000 USDC on eip155:84532 — requires attestation (missing).\n           Complete verification: [link]\n        Which would you like?\"\n\nUser: \"Option 1\"\n\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/9f3c....json' --paymentHash 'a1b2c3...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n\nAgent: \"The weather data shows 22°C in Kyiv.\"\n```\n\n### New 402 after payment (loop)\n\n```\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/9f3c....json' --paymentHash 'a1b2c3...']\n       → { \"status\": \"input_required\", \"data\": { \"newPaymentRequired\": \"eyJ4NDAy...\" } }\n\nAgent: [runs buildX402Payment.js --resource 'https://api.example.com/weather']\n       → { \"status\": \"input_required\", \"data\": { \"resource\": {...}, \"paymentOptions\": [...],\n            \"paymentRequiredFilePath\": \"/tmp/b71e....json\" }}\n…\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/b71e....json' --paymentHash '...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n```\n\n### Attestation required (on chosen payment)\n\n```\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/9f3c....json' --paymentHash 'd4e5f6...']\n       → { \"status\": \"input_required\", \"data\": { \"attestationsRequired\": true,\n            \"message\": \"The following attestations are required to complete the payment:\",\n            \"attestationLinks\": [\"https://wallet.billions.network#request_uri=...\"] }}\n\nAgent: \"You need to complete an attestation before paying. Please open this link: [link]\n        Let me know once you've completed it and I'll retry.\"\nUser: \"Done.\"\nAgent: [retries buildX402Payment.js with same arguments]\n```\n\n### Max use exceeded\n\n```\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/9f3c....json' --paymentHash 'd4e5f6...']\n       → { \"status\": \"input_required\", \"data\": { \"maxUseExceeded\": true,\n            \"message\": \"Payment has exceeded its maximum allowed uses. Choose a different payment or contact the resource provider.\" }}\n\nAgent: \"The selected payment option has reached its maximum number of uses.\n        Please choose a different payment option:\n        1) 10000 USDC on eip155:84532 — no attestations required\n        Which would you like?\"\n\nUser: \"Option 1\"\n\nAgent: [runs buildX402Payment.js --paymentRequiredFilePath '/tmp/9f3c....json' --paymentHash 'a1b2c3...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n```\n\nFile v2.0.4:SKILL.md\n\n---\nname: verified-agent-identity\ndescription: Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify and generate authentication proofs. Based on iden3 self-sovereign identity protocol.\nmetadata:\n  {\n    \"category\": \"identity\",\n    \"clawdbot\":\n      {\n        \"requires\": { \"bins\": [\"node\"] },\n        \"config\": { \"optionalEnv\": [\"BILLIONS_NETWORK_MASTER_KMS_KEY\"] },\n      },\n  }\nhomepage: https://billions.network/\n---\n\n## When to Use This Skill\n\nThis skill covers two capabilities. Read the **router table** below, then load the relevant reference before proceeding.\n\n| Situation                                                               | Reference to load             |\n| ----------------------------------------------------------------------- | ----------------------------- |\n| Create, list, link, verify, or sign with a decentralized identity (DID) | `reference/identity/SKILL.md` |\n| Handle a **402 Payment Required** HTTP response                         | `reference/x402/SKILL.md`     |\n\n> **Always read the appropriate reference SKILL.md before running any script.**\n> If a task spans both (e.g. you need an identity before you can sign a 402 payment), read both.\n\n## Quick Overview\n\n- **Identity** — Create Ethereum-based DIDs on the Billions Network, link them to a human owner, and prove ownership via challenge/response signing.\n- **x402 Payment** — When a server returns `402 Payment Required`, build a signed `PAYMENT-SIGNATURE` header so you can retry the request and gain access.\n\n## Shared Setup\n\nAll identity data is stored in `$HOME/.openclaw/billions`. Scripts live in `scripts/`.\n\n```bash\ncd scripts && npm install && cd ..\n```\n\n## Restrictions / Guardrails (CRITICAL)\n\n**These rules apply to ALL references. Always follow them.**\n\n1. **STRICT: Check Identity First**\n   - Before running `linkHumanToAgent.js`, `signChallenge.js`, or `buildX402Payment.js`, **ALWAYS** check if an identity exists: `node scripts/getIdentities.js`\n   - If no identity is configured, create one first with `createNewEthereumIdentity.js` after that run `linkHumanToAgent.js` to link it to a human owner.\n   - Continue processing the task only after confirming that an identity exists and is linked to a human owner.\n\n2. **STRICT: Stop on Script Failure**\n   - If any script exits with a non-zero status code, **STOP IMMEDIATELY**.\n   - Check stderr for error messages.\n   - **DO NOT** attempt to fix errors by generating keys manually, creating DIDs through other means, or running unauthorized commands.\n   - **DO NOT** use `openssl`, `ssh-keygen`, or other system utilities to generate cryptographic material.\n\n3. **No Manual Workarounds**\n   - You are prohibited from performing manual cryptographic operations.\n   - You are prohibited from directly manipulating files in `$HOME/.openclaw/billions`.\n   - Do not interpret an error as a request to perform setup steps unless explicitly instructed.\n\n## Security\n\nThe directory `$HOME/.openclaw/billions` contains sensitive identity data:\n\n- `kms.json` — **CRITICAL**: Contains private keys (encrypted if `BILLIONS_NETWORK_MASTER_KMS_KEY` is set, otherwise plaintext)\n- `defaultDid.json` — DID identifiers and public keys\n- `challenges.json` — Authentication challenges history\n- `credentials.json` — Verifiable credentials\n- `identities.json` — Identity metadata\n- `profiles.json` — Profile data\n\nAfter the first run, restrict access to this directory: chmod 700 ~/.openclaw/billions\n\nThere are several ways of storing private keys, to enable master key encryption as described in the KMS Encryption section below.\n\nMore about security: `./SECURITY.md`\n\nFile v2.0.4:README.md\n\n# Verified Agent Identity\n\nA decentralized identity management toolkit for AI agents using iden3 protocol on Billions Network.\n\n## Overview\n\nThis skill enables AI agents to create, manage, link, prove and verify ownership of decentralized identities (DIDs) using cryptographic signatures.\n\n## Installation\n\n### Agent CTA:\n\n1. Ask bot to install the skill:\n\n   Install with clawhub:\n\n   ```plaintext\n   Install the skill `npx clawhub@latest install verified-agent-identity`\n   ```\n\n   Or install with skills.sh:\n\n   ```plaintext\n   Intall the skill `npx skills add BillionsNetwork/verified-agent-identity`\n   ```\n\n   Or\n\n   ```plaintext\n   Install the `verified-agent-identity` skill from the OpenClaw clawhub.ai.\n   ```\n\n2. (Optional) If the verification process did not start automatically after installation, ask your bot to initialize the process by sending a message like:\n\n   ```plaintext\n   Please link your agent identity to me.\n   ```\n\n### Human CTA:\n\n1. Install the skill:\n\n   Use clawhub to install the skill:\n\n   ```bash\n   npx clawhub@latest install verified-agent-identity\n   ```\n\n   Use skills.sh to install the skill:\n\n   ```bash\n   npx skills add BillionsNetwork/verified-agent-identity\n   ```\n\n2. Create a new identity:\n\n   ```bash\n   # Generate a new key and create a new identity\n   node scripts/createNewEthereumIdentity.js\n   ```\n\n   Or\n\n   ```bash\n   # Use an existing private key to create an identity\n   BILLIONS_NETWORK_MASTER_KMS_KEY=\"<your-strong-secret>\" node scripts/createNewEthereumIdentity.js --key <your-ethereum-private-key>\n   ```\n\n   > **Warning**: Only pass a **dedicated identity key** to `--key` — never an Ethereum wallet key that holds assets. If the key file is exposed, any key stored here could be used to impersonate the agent or, if reused, to control the associated wallet.\n\n3. Generate a verification link to connect your human identity to the agent:\n\n   ```bash\n   node scripts/manualLinkHumanToAgent.js --challenge '{\"name\": \"Agent Name\", \"description\": \"Short description of the agent\"}'\n   ```\n\n   This prints the verification URL to the console. Open it in your browser to complete the identity linking process.\n\n## Features\n\n- **Identity Creation**: Generate new DIDs with random or existing Ethereum private keys\n- **Identity Management**: List and manage multiple identities with default identity support\n- **Human-Agent Linking**: Link a human identity to an agent's DID through signed challenges\n- **Proof Generation**: Generate cryptographic proofs to authenticate as a specific identity\n- **Proof Verification**: Verify proofs to confirm identity ownership\n\n## Architecture\n\n### Runtime Requirements\n\n- **Node.js `>= v20`** and **npm** are required to run the scripts.\n\n### Dependency Surface\n\nnpm dependencies are intentionally minimal and scoped to well-established, audited packages:\n\n| Package                | Purpose                                                      |\n| ---------------------- | ------------------------------------------------------------ |\n| `@0xpolygonid/js-sdk`  | iden3/Privado ID cryptographic primitives and key management |\n| `@iden3/js-iden3-core` | DID and identity core types                                  |\n| `@iden3/js-iden3-auth` | JWS/JWA authorization response construction and verification |\n| `ethers`               | Ethereum key utilities                                       |\n| `uuid`                 | UUID generation for protocol message IDs                     |\n\nCore libraries governing identity management use pinned, well-tested versions to ensure stability and security.\n\n### Key Storage and Isolation\n\nAll cryptographic material is persisted to `$HOME/.openclaw/billions/` — a directory that lives **outside the agent's workspace**:\n\n| File               | Contents                                                                           |\n| ------------------ | ---------------------------------------------------------------------------------- |\n| `kms.json`         | Private keys — per-entry versioned format; keys are plain or AES-256-GCM encrypted |\n| `identities.json`  | Identity metadata                                                                  |\n| `defaultDid.json`  | Active DID and associated public key                                               |\n| `challenges.json`  | Per-DID challenge history                                                          |\n| `credentials.json` | Verifiable credentials                                                             |\n\nAfter the first run, restrict access to this directory: `chmod 700 ~/.openclaw/billions`\n\nThere are several ways of storing private keys, to enable master key encryption as described in the **KMS Encryption** section below.\n\n### KMS Encryption\n\n> See [SECURITY.md](SECURITY.md) for the full threat model, the rationale for shipping a plaintext storage mode, and the operator hardening checklist.\n\nSet the environment variable `BILLIONS_NETWORK_MASTER_KMS_KEY` to enable AES-256-GCM at-rest encryption for the private keys inside `kms.json`. When set, every key value is individually encrypted on write; when absent, keys are stored as plain hex strings.\n\n**`kms.json` entry format**\n\nEach entry in the array is versioned. The `alias` is always stored in plaintext — only the `key` value is encrypted:\n\n```json\n[\n  {\n    \"version\": 1,\n    \"provider\": \"plain\",\n    \"data\": {\n      \"alias\": \"secp256k1:abc123\",\n      \"key\": \"deadbeef...\",\n      \"createdAt\": \"2026-03-12T13:46:04.094Z\"\n    }\n  },\n  {\n    \"version\": 1,\n    \"provider\": \"encrypted\",\n    \"data\": {\n      \"alias\": \"secp256k1:xyz456\",\n      \"key\": \"<iv_hex>:<authTag_hex>:<ciphertext_hex>\",\n      \"createdAt\": \"2026-02-11T13:00:02.032Z\"\n    }\n  }\n]\n```\n\n**Behavior summary**\n\n| `BILLIONS_NETWORK_MASTER_KMS_KEY` | `provider` on disk | `key` value on disk     |\n| --------------------------------- | ------------------ | ----------------------- |\n| Not set                           | `\"plain\"`          | Raw hex string          |\n| Set                               | `\"encrypted\"`      | `iv:authTag:ciphertext` |\n\n> **Backward compatibility** — the legacy format `[ { \"alias\": \"...\", \"privateKeyHex\": \"...\" } ]` is still read correctly. On the first write the file is automatically migrated to the new per-entry format. No manual step is required.\n\n**How to set the variable**\n\n_Option 1 — openclaw skill config (recommended for agent deployments):_\n\nAdd an `env` block for the skill inside your openclaw config:\n\n```json\n\"skills\": {\n  \"entries\": {\n    \"verified-agent-identity\": {\n      \"env\": {\n        \"BILLIONS_NETWORK_MASTER_KMS_KEY\": \"<your-strong-secret>\"\n      }\n    }\n  }\n}\n```\n\n_Option 2 — shell or process environment:_\n\n```bash\nexport BILLIONS_NETWORK_MASTER_KMS_KEY=\"<your-strong-secret>\"\nnode scripts/createNewEthereumIdentity.js\nnode scripts/manualLinkHumanToAgent.js --challenge '{\"name\": \"Agent Name\", \"description\": \"Short description of the agent\"}'\n```\n\nFor all other ways to pass environment variables to a skill see the [OpenClaw environment documentation](https://docs.openclaw.ai/help/environment).\n\n**CRITICAL**: Save master keys securely and do not share them. If the master key is lost, all encrypted keys will be lost.\n\n### Network and External Binary Policy\n\n- All external https calls will be made to trusted resources. Signed JWS attestation (proof of agent ownership) is encoded securely by utilizing robust security practices. It requires an explicit user consent to pass it to any other source.\n- All network calls are directed to legitimate DID resolvers (resolver.privado.id) or the project's own infrastructure (billions.network). These network calls cannot exfiltrate signed attestations or identity data to other third-party services by skill design. Wallet interaction is possible only through explicit action from the user side with consent. Also attestation contains only publicly verifiable information.\n- Whitelisted domains:\n  - `resolver.privado.id` (DID resolution)\n  - `billions.network` (Billions Network interactions)\n  - `polygonid.me` (Polygon ID interactions)\n\n## Documentation\n\nSee [SKILL.md](SKILL.md) for detailed usage instructions and examples.\n\nFile v2.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7b32r236rckzwn88kc1jqhcn81hzrv\",\n  \"slug\": \"identity\",\n  \"version\": \"2.0.4\",\n  \"publishedAt\": 1779096882234\n}\n\nFile v2.0.4:scripts/package-lock.json\n\n{\n  \"name\": \"verified-agent-identity\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"verified-agent-identity\",\n      \"version\": \"1.0.0\",\n      \"license\": \"UNLICENSED\",\n      \"dependencies\": {\n        \"@0xpolygonid/js-sdk\": \"1.42.1\",\n        \"@billionsnetwork/x402-human-proof-client\": \"^0.1.6\",\n        \"@iden3/js-iden3-auth\": \"1.14.0\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@x402/core\": \"2.9.0\",\n        \"@x402/evm\": \"2.9.0\",\n        \"ethers\": \"6.13.4\",\n        \"uuid\": \"11.0.3\",\n        \"viem\": \"2.47.6\",\n        \"yargs\": \"^18.0.0\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk\": {\n      \"version\": \"1.42.1\",\n      \"resolved\": \"https://registry.npmjs.org/@0xpolygonid/js-sdk/-/js-sdk-1.42.1.tgz\",\n      \"integrity\": \"sha512-2X0zFGfygtu4D7X2DSiI3GxQ7vp3+iNQ05WeTi4u9aPj+9/sxYsVDJnRsHDZzmCCVO9kzmb2DQ1uxs5JtTrhPA==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@iden3/onchain-non-merklized-issuer-base-abi\": \"0.0.3\",\n        \"@iden3/universal-verifier-v2-abi\": \"2.0.2\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@solana/web3.js\": \"1.98.4\",\n        \"ajv\": \"8.17.1\",\n        \"ajv-formats\": \"3.0.1\",\n        \"borsh\": \"0.7.0\",\n        \"canonicalize\": \"^2.1.0\",\n        \"did-jwt\": \"8.0.18\",\n        \"did-resolver\": \"4.1.0\",\n        \"ethers\": \"6.15.0\",\n        \"idb-keyval\": \"6.2.2\",\n        \"jose\": \"^6.1.0\",\n        \"jsonld\": \"8.3.3\",\n        \"pubsub-js\": \"1.9.5\",\n        \"quick-lru\": \"7.0.1\",\n        \"uuid\": \"13.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/ethers\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz\",\n      \"integrity\": \"sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/ethers-io/\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@adraffy/ens-normalize\": \"1.10.1\",\n        \"@noble/curves\": \"1.2.0\",\n        \"@noble/hashes\": \"1.3.2\",\n        \"@types/node\": \"22.7.5\",\n        \"aes-js\": \"4.0.0-beta.5\",\n        \"tslib\": \"2.7.0\",\n        \"ws\": \"8.17.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/ethers/node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/tslib\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz\",\n      \"integrity\": \"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/@adraffy/ens-normalize\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz\",\n      \"integrity\": \"sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@babel/runtime\": {\n      \"version\": \"7.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz\",\n      \"integrity\": \"sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client\": {\n      \"version\": \"0.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/@billionsnetwork/x402-human-proof-client/-/x402-human-proof-client-0.1.6.tgz\",\n      \"integrity\": \"sha512-RYXfJi06Itq0ND2ZGNcvNIIPM+MbA/+EPoIgGBJlK0jfPFMRGUI441+gL1koZJjygDe6NnlZay4rKwe7sztDKQ==\",\n      \"license\": \"UNLICENSED\",\n      \"dependencies\": {\n        \"@0xpolygonid/js-sdk\": \"^1.43.0\",\n        \"@iden3/js-iden3-core\": \"^1.8.0\",\n        \"@x402/core\": \"^2.9.0\",\n        \"bs58\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/@0xpolygonid/js-sdk\": {\n      \"version\": \"1.43.0\",\n      \"resolved\": \"https://registry.npmjs.org/@0xpolygonid/js-sdk/-/js-sdk-1.43.0.tgz\",\n      \"integrity\": \"sha512-Zsf92vtAtjPY4Fx0lJ0PZXr4AzhmZ0aqlPrKF283gyQJt3LIZLf9wdD9VaSI/rF7hlLi2mCuyj5zSOoNWlEbtQ==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@iden3/onchain-non-merklized-issuer-base-abi\": \"0.0.3\",\n        \"@iden3/universal-verifier-v2-abi\": \"2.0.2\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@solana/web3.js\": \"1.98.4\",\n        \"ajv\": \"8.17.1\",\n        \"ajv-formats\": \"3.0.1\",\n        \"borsh\": \"0.7.0\",\n        \"canonicalize\": \"^2.1.0\",\n        \"did-jwt\": \"8.0.18\",\n        \"did-resolver\": \"4.1.0\",\n        \"ethers\": \"6.15.0\",\n        \"idb-keyval\": \"6.2.2\",\n        \"jose\": \"^6.1.0\",\n        \"jsonld\": \"8.3.3\",\n        \"pubsub-js\": \"1.9.5\",\n        \"quick-lru\": \"7.0.1\",\n        \"uuid\": \"13.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/ethers\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz\",\n      \"integrity\": \"sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/ethers-io/\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@adraffy/ens-normalize\": \"1.10.1\",\n        \"@noble/curves\": \"1.2.0\",\n        \"@noble/hashes\": \"1.3.2\",\n        \"@types/node\": \"22.7.5\",\n        \"aes-js\": \"4.0.0-beta.5\",\n        \"tslib\": \"2.7.0\",\n        \"ws\": \"8.17.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/ethers/node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/tslib\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz\",\n      \"integrity\": \"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/@digitalbazaar/http-client\": {\n      \"version\": \"3.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz\",\n      \"integrity\": \"sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"ky\": \"^0.33.3\",\n        \"ky-universal\": \"^0.11.0\",\n        \"undici\": \"^5.21.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abi\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz\",\n      \"integrity\": \"sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/hash\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abstract-provider\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz\",\n      \"integrity\": \"sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/networks\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"@ethersproject/web\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abstract-signer\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz\",\n      \"integrity\": \"sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/address\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz\",\n      \"integrity\": \"sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/rlp\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/base64\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz\",\n      \"integrity\": \"sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/basex\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz\",\n      \"integrity\": \"sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/bignumber\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz\",\n      \"integrity\": \"sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"bn.js\": \"^5.2.1\"\n      }\n    },\n    \"node_modules/@ethersproject/bytes\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz\",\n      \"integrity\": \"sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/constants\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz\",\n      \"integrity\": \"sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/contracts\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz\",\n      \"integrity\": \"sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abi\": \"^5.8.0\",\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/hash\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz\",\n      \"integrity\": \"sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/base64\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/hdnode\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz\",\n      \"integrity\": \"sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/basex\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/pbkdf2\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/sha2\": \"^5.8.0\",\n        \"@ethersproject/signing-key\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"@ethersproject/wordlists\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/json-wallets\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz\",\n      \"integrity\": \"sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/hdnode\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/pbkdf2\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/random\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"aes-js\": \"3.0.0\",\n        \"scrypt-js\": \"3.0.1\"\n      }\n    },\n    \"node_modules/@ethersproject/json-wallets/node_modules/aes-js\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz\",\n      \"integrity\": \"sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@ethersproject/keccak256\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz\",\n      \"integrity\": \"sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"js-sha3\": \"0.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/logger\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz\",\n      \"integrity\": \"sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@ethersproject/networks\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz\",\n      \"integrity\": \"sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/pbkdf2\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz\",\n      \"integrity\": \"sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/sha2\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/properties\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz\",\n      \"integrity\": \"sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/providers\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz\",\n      \"integrity\": \"sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/base64\": \"^5.8.0\",\n        \"@ethersproject/basex\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/hash\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/networks\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/random\": \"^5.8.0\",\n        \"@ethersproject/rlp\": \"^5.8.0\",\n        \"@ethersproject/sha2\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"@ethersproject/web\": \"^5.8.0\",\n        \"bech32\": \"1.1.4\",\n        \"ws\": \"8.18.0\"\n      }\n    },\n    \"node_modules/@ethersproject/providers/node_modules/ws\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.18.0.tgz\",\n      \"integrity\": \"sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@ethersproject/random\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz\",\n      \"integrity\": \"sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/rlp\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz\",\n      \"integrity\": \"sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/sha2\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz\",\n      \"integrity\": \"sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"hash.js\": \"1.1.7\"\n      }\n    },\n    \"node_modules/@ethersproject/signing-key\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz\",\n      \"integrity\": \"sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"bn.js\": \"^5.2.1\",\n        \"elliptic\": \"6.6.1\",\n        \"hash.js\": \"1.1.7\"\n      }\n    },\n    \"node_modules/@ethersproject/solidity\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz\",\n      \"integrity\": \"sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/sha2\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/strings\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz\",\n      \"integrity\": \"sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/transactions\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz\",\n      \"integrity\": \"sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/rlp\": \"^5.8.0\",\n        \"@ethersproject/signing-key\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/units\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz\",\n      \"integrity\": \"sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/wallet\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz\",\n      \"integrity\": \"sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/hash\": \"^5.8.0\",\n        \"@ethersproject/hdnode\": \"^5.8.0\",\n        \"@ethersproject/json-wallets\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/random\": \"^5.8.0\",\n        \"@ethersproject/signing-key\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"@ethersproject/wordlists\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/web\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz\",\n      \"integrity\": \"sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/base64\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/wordlists\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz\",\n      \"integrity\": \"sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/hash\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@fastify/busboy\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz\",\n      \"integrity\": \"sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@iden3/bigarray\": {\n      \"version\": \"0.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz\",\n      \"integrity\": \"sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==\",\n      \"license\": \"GPL-3.0\",\n      \"peer\": true\n    },\n    \"node_modules/@iden3/binfileutils\": {\n      \"version\": \"0.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz\",\n      \"integrity\": \"sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==\",\n      \"license\": \"GPL-3.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"fastfile\": \"0.0.20\",\n        \"ffjavascript\": \"^0.3.0\"\n      }\n    },\n    \"node_modules/@iden3/js-crypto\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-crypto/-/js-crypto-1.3.2.tgz\",\n      \"integrity\": \"sha512-B1Fk8NLIhvEahFf02VKkmmXrw6Q+n+b3pbiFUYA9eesgoTZTSPtYtb+8A2jIKZrfdYKS5PlKJC8nNWmHUGk+6w==\",\n      \"license\": \"AGPL-3.0\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth\": {\n      \"version\": \"1.14.0\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-iden3-auth/-/js-iden3-auth-1.14.0.tgz\",\n      \"integrity\": \"sha512-72xd5HXQqUXIy5JfQ2Yf1tNUf0l7qj1hZPE4navuRMAgO+Pycy2x/T8vB7N8UwWCuoijV+AR+xy2PvfCAPL22Q==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@0xpolygonid/js-sdk\": \"1.39.4\",\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"did-resolver\": \"^4.1.0\",\n        \"ethers\": \"^5.7.2\",\n        \"tslib\": \"^2.6.2\",\n        \"uuid\": \"^9.0.1\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/@0xpolygonid/js-sdk\": {\n      \"version\": \"1.39.4\",\n      \"resolved\": \"https://registry.npmjs.org/@0xpolygonid/js-sdk/-/js-sdk-1.39.4.tgz\",\n      \"integrity\": \"sha512-HO51/FMifdIIaRKUU0U7Y1KaEr5aio/J4oAXREFcxZEAqPpl0AZXTEVAJreEXShogeNGQDNixeg50ILzB4cvEA==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@iden3/onchain-non-merklized-issuer-base-abi\": \"0.0.3\",\n        \"@iden3/universal-verifier-v2-abi\": \"2.0.2\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@solana/web3.js\": \"1.98.4\",\n        \"ajv\": \"8.17.1\",\n        \"ajv-formats\": \"3.0.1\",\n        \"borsh\": \"0.7.0\",\n        \"canonicalize\": \"^2.1.0\",\n        \"did-jwt\": \"8.0.18\",\n        \"did-resolver\": \"4.1.0\",\n        \"ethers\": \"6.15.0\",\n        \"idb-keyval\": \"6.2.2\",\n        \"jose\": \"^6.1.0\",\n        \"jsonld\": \"8.3.3\",\n        \"pubsub-js\": \"1.9.5\",\n        \"quick-lru\": \"7.0.1\",\n        \"uuid\": \"13.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/@0xpolygonid/js-sdk/node_modules/ethers\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz\",\n      \"integrity\": \"sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/ethers-io/\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@adraffy/ens-normalize\": \"1.10.1\",\n        \"@noble/curves\": \"1.2.0\",\n        \"@noble/hashes\": \"1.3.2\",\n        \"@types/node\": \"22.7.5\",\n        \"aes-js\": \"4.0.0-beta.5\",\n        \"tslib\": \"2.7.0\",\n        \"ws\": \"8.17.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/@0xpolygonid/js-sdk/node_modules/ethers/node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/@0xpolygonid/js-sdk/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/ethers\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz\",\n      \"integrity\": \"sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abi\": \"5.8.0\",\n        \"@ethersproject/abstract-provider\": \"5.8.0\",\n        \"@ethersproject/abstract-signer\": \"5.8.0\",\n        \"@ethersproject/address\": \"5.8.0\",\n        \"@ethersproject/base64\": \"5.8.0\",\n        \"@ethersproject/basex\": \"5.8.0\",\n        \"@ethersproject/bignumber\": \"5.8.0\",\n        \"@ethersproject/bytes\": \"5.8.0\",\n        \"@ethersproject/constants\": \"5.8.0\",\n        \"@ethersproject/contracts\": \"5.8.0\",\n        \"@ethersproject/hash\": \"5.8.0\",\n        \"@ethersproject/hdnode\": \"5.8.0\",\n        \"@ethersproject/json-wallets\": \"5.8.0\",\n        \"@ethersproject/keccak256\": \"5.8.0\",\n        \"@ethersproject/logger\": \"5.8.0\",\n        \"@ethersproject/networks\": \"5.8.0\",\n        \"@ethersproject/pbkdf2\": \"5.8.0\",\n        \"@ethersproject/properties\": \"5.8.0\",\n        \"@ethersproject/providers\": \"5.8.0\",\n        \"@ethersproject/random\": \"5.8.0\",\n        \"@ethersproject/rlp\": \"5.8.0\",\n        \"@ethersproject/sha2\": \"5.8.0\",\n        \"@ethersproject/signing-key\": \"5.8.0\",\n        \"@ethersproject/solidity\": \"5.8.0\",\n        \"@ethersproject/strings\": \"5.8.0\",\n        \"@ethersproject/transactions\": \"5.8.0\",\n        \"@ethersproject/units\": \"5.8.0\",\n        \"@ethersproject/wallet\": \"5.8.0\",\n        \"@ethersproject/web\": \"5.8.0\",\n        \"@ethersproject/wordlists\": \"5.8.0\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/tslib\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz\",\n      \"integrity\": \"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/@iden3/js-iden3-auth/node_modules/uuid\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz\",\n      \"integrity\": \"sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==\",\n      \"deprecated\": \"uuid@10 and below is no longer supported.  For ESM codebases, update to uuid@latest.  For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist/bin/uuid\"\n      }\n    },\n    \"node_modules/@iden3/js-iden3-core\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-iden3-core/-/js-iden3-core-1.8.0.tgz\",\n      \"integrity\": \"sha512-HoKRgVsCsq78r4EwFe98rdZKOgwEFXqV2SMwZ8bl2jIvUbabJQBTL1IYc7SGh0KvEpVisPq5NuwHJaSyvghqPQ==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\"\n      }\n    },\n    \"node_modules/@iden3/js-jsonld-merklization\": {\n      \"version\": \"1.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-jsonld-merklization/-/js-jsonld-merklization-1.7.2.tgz\",\n      \"integrity\": \"sha512-pXC2YO0yyD6YXgqZCivxmCxBFGs14sLS/AoQzjos8pNDrb3bYm3s+eMfz+4GwCKNpzzTFWSMHJNxzp/HUTEQZA==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@js-temporal/polyfill\": \"0.5.1\",\n        \"jsonld\": \"8.3.3\",\n        \"n3\": \"1.26.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\"\n      }\n    },\n    \"node_modules/@iden3/js-jwz\": {\n      \"version\": \"1.12.2\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-jwz/-/js-jwz-1.12.2.tgz\",\n      \"integrity\": \"sha512-IfAJz84u1zLPJqEWGLahGFiKYCyeNY+3JpPft/3pVtgm10tYZIBobV4F+g/o2FdruoEgpFtFNUQ1o/7zsmwFEQ==\",\n      \"license\": \"AGPL-3.0\",\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"@noble/curves\": \"^1.9.2\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@iden3/js-merkletree\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/js-merkletree/-/js-merkletree-1.5.1.tgz\",\n      \"integrity\": \"sha512-EABFNqnxXDvS7uZL5wAgHP4VzAnOo3STxADj2Ian/BYKNfWZjOe+WjsVizCU/7jJuafJDEZOeCLbZeIhHRzwLg==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"idb-keyval\": \"6.2.2\"\n      }\n    },\n    \"node_modules/@iden3/onchain-non-merklized-issuer-base-abi\": {\n      \"version\": \"0.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/onchain-non-merklized-issuer-base-abi/-/onchain-non-merklized-issuer-base-abi-0.0.3.tgz\",\n      \"integrity\": \"sha512-4Mt5iP54KEzh0vbyhwKINx8bdZDyDJ6At92dPi3VKbKvk4dN24MlOQx5BfRakkZYJe7xlvMo/QaOjc/zRAlADg==\",\n      \"license\": \"MIT or Apache-2.0\"\n    },\n    \"node_modules/@iden3/universal-verifier-v2-abi\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@iden3/universal-verifier-v2-abi/-/universal-verifier-v2-abi-2.0.2.tgz\",\n      \"integrity\": \"sha512-GJY1h9aPb4RrfjSjs3mThZfu7Puki5eM5OVIZaxuZKlzvqhSwS4WFm1r61FBSR45FUeshZTXts4KwZaE0JT4ug==\",\n      \"license\": \"MIT or Apache-2.0\"\n    },\n    \"node_modules/@js-temporal/polyfill\": {\n      \"version\": \"0.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.5.1.tgz\",\n      \"integrity\": \"sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"jsbi\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@multiformats/base-x\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz\",\n      \"integrity\": \"sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@noble/ciphers\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz\",\n      \"integrity\": \"sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"^14.21.3 || >=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@noble/curves\": {\n      \"version\": \"1.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz\",\n      \"integrity\": \"sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\n\nFile v2.0.4:scripts/package.json\n\n{\n  \"name\": \"verified-agent-identity\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Billions OpenClaw verification skill\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [\n    \"identity\",\n    \"openclaw\",\n    \"zk\"\n  ],\n  \"author\": \"BillionsNetwork\",\n  \"license\": \"UNLICENSED\",\n  \"dependencies\": {\n    \"@0xpolygonid/js-sdk\": \"1.42.1\",\n    \"@billionsnetwork/x402-human-proof-client\": \"^0.1.6\",\n    \"@iden3/js-iden3-auth\": \"1.14.0\",\n    \"@iden3/js-iden3-core\": \"1.8.0\",\n    \"@noble/curves\": \"1.9.2\",\n    \"@x402/core\": \"2.9.0\",\n    \"@x402/evm\": \"2.9.0\",\n    \"ethers\": \"6.13.4\",\n    \"uuid\": \"11.0.3\",\n    \"viem\": \"2.47.6\",\n    \"yargs\": \"^18.0.0\"\n  }\n}\n\nFile v2.0.4:SECURITY.md\n\n# Security Policy\n\nThis document describes the security model of the `verified-agent-identity` skill, the threats it does and does not defend against, and the rationale behind design decisions that may surface in automated security scans.\n\n## Scope\n\n`verified-agent-identity` is a **local CLI skill**. It runs on a single operator's host, creates a decentralized identity (DID) for an AI agent, signs challenges with the agent's private key, and persists state under `~/.openclaw/billions/`. It is not a network service, has no listening port, and does not provide multi-tenant trust boundaries.\n\nThe only secret it manages is the agent's identity private key, stored in `~/.openclaw/billions/kms.json`.\n\n## Threat Model\n\n**In scope:**\n\n- Preventing the identity key from being accidentally committed into the workspace or read by tools that operate inside the project directory.\n- Protecting the key against casual disclosure on a single-user host (e.g. shoulder-surfing, accidental file sharing, careless backups).\n- Preventing operator mistakes that would let an identity key double as an asset-holding wallet key.\n- Providing opt-in at-rest encryption for shared/multi-user hosts and for environments where compliance requires it.\n\n**Out of scope:**\n\n- An attacker with read access to the operator's home directory or process memory. This is equivalent to full host compromise; no local secret-storage scheme defends against it without an external HSM or OS keystore, and integrating those would expand the dependency surface beyond what this skill commits to.\n- Full-disk forensic recovery on a host the attacker physically controls.\n- Hostile code already running with the operator's privileges.\n\n## Storage Modes\n\nPrivate keys are written to `~/.openclaw/billions/kms.json` in one of two formats, selected by the presence of the `BILLIONS_NETWORK_MASTER_KMS_KEY` environment variable.\n\n| `BILLIONS_NETWORK_MASTER_KMS_KEY` | `provider` on disk | `key` value on disk     | Posture                      |\n| --------------------------------- | ------------------ | ----------------------- | ---------------------------- |\n| Not set                           | `\"plain\"`          | Raw hex string          | Acceptable on a single-user host with `chmod 700 ~/.openclaw/billions`. |\n| Set                               | `\"encrypted\"`      | `iv:authTag:ciphertext` | **Recommended for all deployments.** AES-256-GCM at rest. |\n\nMode is selected per-write, so an operator can switch from `plain` to `encrypted` at any time by exporting the variable before the next key creation or import — no migration step is required.\n\n## Compensating Controls\n\nThe following mitigations are present in the codebase and the documented installation flow:\n\n- **Out-of-workspace storage.** Keys live under `~/.openclaw/billions/`, never inside the project directory. Tools (and the agent itself) that operate inside the workspace cannot read or exfiltrate them.\n- **Filesystem hardening.** The README instructs the operator to run `chmod 700 ~/.openclaw/billions` after the first run (`README.md` → \"Key Storage and Isolation\").\n- **Dedicated-key warning.** The README warns the operator never to import an Ethereum wallet key that holds assets, only a dedicated identity key (`README.md` step 2 warning under the Human CTA).\n- **At-rest encryption available behind one env var.** AES-256-GCM is provided via `BILLIONS_NETWORK_MASTER_KMS_KEY`. No code change, no migration, no extra dependency.\n- **Versioned on-disk format.** Each `kms.json` entry carries a `version` and `provider` field, so future format upgrades (e.g. an OS-keystore provider) can ship without breaking existing installs. Legacy entries auto-migrate on next write (see `scripts/shared/storage/keys.js`, `_decodeEntry` legacy branch).\n\n## Scanner Findings — Acknowledged Risks\n\n### Identity and Privilege Abuse — `scripts/shared/storage/keys.js` (plaintext storage branch)\n\n**Finding (verbatim):**\n\n> When no master key is configured, the key-storage code writes the raw private key value into `kms.json` as a plaintext entry.\n>\n> **User impact** — Anyone or any process that can read `~/.openclaw/billions/kms.json` may be able to impersonate the agent identity; if a real asset-holding Ethereum key is imported, the impact could extend beyond the agent identity.\n>\n> **Recommendation** — Set `BILLIONS_NETWORK_MASTER_KMS_KEY` before creating or importing keys, use only a dedicated no-assets identity key, restrict `~/.openclaw/billions` permissions, and avoid importing any wallet key that controls funds.\n\n**Status: acknowledged, accepted — every item in the scanner's recommendation is already a documented and shipped control.**\n\nThe flagged code path is the documented `provider: \"plain\"` mode (see [Storage Modes](#storage-modes)). It is the default **only because the env var is unset**; setting `BILLIONS_NETWORK_MASTER_KMS_KEY` switches the same code path to AES-256-GCM with no further operator action. The threat the plaintext mode enables — local read of `~/.openclaw/billions/kms.json` on the operator's own host — is out of scope per the [Threat Model](#threat-model) above: an attacker with that level of access already controls the operator's shell history, SSH agent, browser secrets, and process memory.\n\n#### Recommendation-to-Control mapping\n\n| Scanner recommendation | Control in this repository | Reference |\n| --- | --- | --- |\n| Set `BILLIONS_NETWORK_MASTER_KMS_KEY` before creating or importing keys | A `> Note` block immediately precedes every key-creation command in the README, instructing the operator to set the variable. The `KMS Encryption` section documents the on-disk format change and the AES-256-GCM scheme. | `README.md` → \"KMS Encryption\" |\n| Use only a dedicated, no-assets identity key | An explicit `> Warning` block under the key-creation step tells the operator never to pass an asset-holding wallet key to `--key`. | `README.md` step 2 of \"Human CTA\" |\n| Restrict `~/.openclaw/billions` permissions | The \"Key Storage and Isolation\" section instructs `chmod 700 ~/.openclaw/billions` after the first run. The directory itself sits **outside the agent workspace**, so workspace-scoped tools cannot read it. | `README.md` → \"Key Storage and Isolation\" |\n| Avoid importing any wallet key that controls funds | Same `> Warning` block as above; reinforced in the [Operator Checklist](#operator-checklist) below. | `README.md` step 2 warning + this document |\n\n#### Why the plaintext mode is retained\n\n1. **Zero-config local development and CI smoke tests** — no master secret to fetch or commit.\n2. **Backward compatibility** — existing `kms.json` files written by earlier versions of the skill remain readable; legacy entries auto-migrate on the next write (`scripts/shared/storage/keys.js` → `_decodeEntry` legacy branch).\n3. **Single code path** — the same write path becomes encrypted at rest the moment `BILLIONS_NETWORK_MASTER_KMS_KEY` is set. There is no separate \"secure mode\" the operator has to migrate to, so the plaintext default cannot drift away from the encrypted path over time.\n\nThe [Operator Checklist](#operator-checklist) is the recommended deployment posture and exactly matches the scanner's recommendation.\n\n## Operator Checklist\n\n1. **Set the master key first.**\n   ```bash\n   export BILLIONS_NETWORK_MASTER_KMS_KEY=\"<a strong secret>\"\n   ```\n   Do this **before** the first `node scripts/createNewEthereumIdentity.js`. Keys created without it are written as `provider: \"plain\"`.\n2. **Use a dedicated identity key.** Never reuse an Ethereum private key that holds assets. If the `kms.json` file is exposed, every key inside it should be revocable / disposable.\n3. **Restrict the storage directory.**\n   ```bash\n   chmod 700 ~/.openclaw/billions\n   ```\n4. **Back up the master key out of band.** If `BILLIONS_NETWORK_MASTER_KMS_KEY` is lost, every entry written under `provider: \"encrypted\"` is unrecoverable.\n\n## Reporting a Vulnerability\n\nPlease report suspected vulnerabilities privately to the Billions Network security contact rather than filing a public issue. Open an issue marked `security` requesting a private disclosure channel if you do not already have one.\n\nFile v2.0.4:skill-card.md\n\n## Description:\n\nKnow Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify and generate authentication proofs. Based on iden3 self-sovereign identity protocol.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[billionsnetwork](https://clawhub.ai/user/billionsnetwork)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use this skill to create, manage, link, prove, and verify decentralized identities for AI agents. It also helps agents handle x402 payment-required responses by presenting payment options for explicit user confirmation and generating signed payment requests.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Private identity keys may be stored insecurely when the master key environment variable is not configured.\n\nMitigation: Set BILLIONS_NETWORK_MASTER_KMS_KEY before creating or importing an identity and restrict ~/.openclaw/billions permissions to the local operator.\n\nRisk: Reusing an asset-holding Ethereum wallet key could expand the impact of key disclosure beyond agent identity impersonation.\n\nMitigation: Use only a dedicated no-funds identity key for this skill.\n\nRisk: The x402 payment flow can sign payment requests after user selection, so a misleading destination, recipient, asset contract, network, or amount could cause unintended payment.\n\nMitigation: Use the payment flow only after independently verifying the destination, recipient, asset contract, network, amount, and user consent.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/billionsnetwork/skills/identity)\n- [Billions Network](https://billions.network/)\n- [Artifact README](artifact/README.md)\n- [Security Policy](artifact/SECURITY.md)\n- [Identity Reference](artifact/reference/identity/SKILL.md)\n- [x402 Payment Reference](artifact/reference/x402/SKILL.md)\n- [OpenClaw environment documentation](https://docs.openclaw.ai/help/environment)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, JSON, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown and text guidance with inline shell commands, JSON script output, DID strings, verification URLs, and payment-signature flow data.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs can include local identity records, authentication proofs, signed challenge results, and x402 payment option data that requires explicit user confirmation before payment execution.]\n\n## Skill Version(s):\n\n2.0.4 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.0.3: 31 files, 63939 bytes\n\nFiles: README.md (8190b), reference/identity/SKILL.md (4669b), reference/x402/SKILL.md (12012b), scripts/buildX402Payment.js (8101b), scripts/createNewEthereumIdentity.js (1835b), scripts/generateChallenge.js (742b), scripts/getDidDocument.js (593b), scripts/getIdentities.js (521b), scripts/linkHumanToAgent.js (1746b), scripts/manualLinkHumanToAgent.js (675b), scripts/package-lock.json (124428b), scripts/package.json (662b), scripts/shared/attestation.js (2230b), scripts/shared/bootstrap.js (4099b), scripts/shared/constants.js (1871b), scripts/shared/scopes.js (1036b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils/auth.js (2750b), scripts/shared/utils/cli.js (1240b), scripts/shared/utils/did.js (1068b), scripts/shared/utils/index.js (1264b), scripts/signChallenge.js (2042b), scripts/verifySignature.js (1930b), SECURITY.md (8221b), SKILL.md (3556b), _meta.json (127b)\n\nFile v2.0.3:reference/identity/SKILL.md\n\n# Identity Reference\n\nManage decentralized identities (DIDs) on the Billions Network — create, list, link to a human owner, and verify ownership.\n\n## When to Use\n\n- You need to create a new agent identity.\n- You need to link your agent identity to a human owner.\n- You need to sign a challenge to prove identity ownership.\n- You need to verify someone else's identity.\n- You need to list existing local identities.\n\n## Scripts\n\n### createNewEthereumIdentity.js\n\n**Command**: `node scripts/createNewEthereumIdentity.js [--key <privateKeyHex>]`\n\nCreates a new identity on the Billions Network. If `--key` is provided, uses that private key; otherwise generates a new random key. The created identity is automatically set as default.\n\n```bash\n# Generate a new random identity\nnode scripts/createNewEthereumIdentity.js\n\n# Create identity from existing private key\nnode scripts/createNewEthereumIdentity.js --key 0x1234567890abcdef...\n```\n\n**Output**: DID string (e.g., `did:iden3:billions:main:2VmAk7fGHQP5FN2jZ8X9Y3K4W6L1M...`)\n\n---\n\n### getIdentities.js\n\n**Command**: `node scripts/getIdentities.js`\n\nLists all DID identities stored locally. **Always run this before any signing or linking operation.**\n\n```bash\nnode scripts/getIdentities.js\n```\n\n**Output**: JSON array of identity entries\n\n```json\n[\n  {\n    \"did\": \"did:iden3:billions:main:2VmAk...\",\n    \"publicKeyHex\": \"0x04abc123...\",\n    \"isDefault\": true\n  }\n]\n```\n\n---\n\n### linkHumanToAgent.js\n\n**Command**: `node scripts/linkHumanToAgent.js --challenge <challenge> [--did <did>]`\n\nSigns the challenge and links a human user to the agent's DID by creating a verification request. Uses the Billions ERC-8004 Registry (agent registration) and the Billions Attestation Registry (ownership attestation after verifying human uniqueness).\n\n- `--challenge` — (required) Challenge to sign. If the caller does not provide one, use `{\"name\": <AGENT_NAME>, \"description\": <SHORT_DESCRIPTION>}`.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"AI persona\"}'\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### generateChallenge.js\n\n**Command**: `node scripts/generateChallenge.js --did <did>`\n\nGenerates a random challenge for identity verification. Stores the challenge in `$HOME/.openclaw/billions/challenges.json`.\n\n```bash\nnode scripts/generateChallenge.js --did did:iden3:billions:main:2VmAk...\n```\n\n**Output**: Challenge string (e.g., `8472951360`)\n\n---\n\n### signChallenge.js\n\n**Command**: `node scripts/signChallenge.js --challenge <challenge> [--did <did>]`\n\nSigns a challenge with a DID's private key to prove identity ownership and sends the JWS token.\n\n- `--challenge` — (required) Challenge to sign.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/signChallenge.js --challenge 8472951360\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### verifySignature.js\n\n**Command**: `node scripts/verifySignature.js --did <did> --token <token>`\n\nVerifies a signed challenge to confirm DID ownership.\n\n```bash\nnode scripts/verifySignature.js --did did:iden3:billions:main:2VmAk... --token eyJhbGciOiJFUzI1NkstUi...\n```\n\n**Output**: `Signature verified successfully` (on success) or error message (on failure)\n\n---\n\n## Workflows\n\n### Link Your Agent Identity to an Owner\n\n1. Check for existing identity: `node scripts/getIdentities.js`\n   - If none exists → `node scripts/createNewEthereumIdentity.js`\n2. Run: `node scripts/linkHumanToAgent.js --challenge <challenge_value>`\n   - Use caller's challenge if provided, otherwise use `{\"name\": <AGENT_NAME>, \"description\": <SHORT_DESCRIPTION>}`.\n3. Return the result to the caller.\n\n**Example Conversation:**\n\n```\nUser: \"Link your agent identity to me\"\nAgent: [runs getIdentities.js, confirms identity exists]\nAgent: [runs linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"Coding assistant\"}']\nAgent: \"Done — here's the verification link: ...\"\n```\n\n### Verify Someone Else's Identity\n\n1. Ask: \"Please provide your DID to start verification.\"\n2. Generate challenge: `node scripts/generateChallenge.js --did <user_did>`\n3. Ask user to sign: \"Please sign this challenge: `<challenge_value>`\"\n4. Verify: `node scripts/verifySignature.js --did <user_did> --token <user_token>`\n5. Report result.\n\n**Example Conversation:**\n\n```\nAgent: \"Please provide your DID to start verification.\"\nUser: \"My DID is did:iden3:billions:main:2VmAk...\"\nAgent: [runs generateChallenge.js] → \"Please sign this challenge: 789012\"\nUser: [provides token]\nAgent: [runs verifySignature.js] → \"Identity verified. You are confirmed as owner of that DID.\"\n```\n\nFile v2.0.3:reference/x402/SKILL.md\n\n# x402 Payment Reference\n\nHandle `402 Payment Required` HTTP responses by executing payment and fetching the protected resource.\n\n## When to Use\n\n- A server responds with **HTTP 402 Payment Required**.\n- The response includes a `PAYMENT-REQUIRED` header describing the payment challenge.\n\n## Script\n\n### buildX402Payment.js\n\n**Command**: `node scripts/buildX402Payment.js --paymentRequired <json> [--did <did>] [--paymentHash <hash>]`\n**Hint**: **NEVER reuse or cache a previous response from this script.** Every invocation produces unique, time-sensitive output (nonces, signatures, payment tokens). Always execute the script again to get a fresh result — even if the arguments are identical to a prior call.\n\nExecutes the x402 payment flow: signs the payment challenge, sends the `PAYMENT-SIGNATURE` header to the resource URL, and returns the result.\n\n- `--paymentRequired` — (required) The value of the `PAYMENT-REQUIRED` response header (base64-encoded or raw JSON string). Its `resource.url` field must be a non-empty string; otherwise the script returns status `failed`.\n- `--did` — (optional) The DID of the signer. Uses the default DID if omitted.\n- `--paymentHash` — (optional) The SHA-256 hash of the chosen payment option. Required on the second call to confirm the chosen payment — always, even when the server offers only one option.\n\n---\n\n## Output Statuses\n\nThe script outputs JSON to stdout. Check the `status` field:\n\n| Status           | Meaning                                                                                                           |\n| ---------------- | ----------------------------------------------------------------------------------------------------------------- |\n| `input_required` | The script needs user input or another loop iteration (payment selection, attestation, or new `paymentRequired`). |\n| `success`        | The resource was fetched successfully. `data` contains the response body.                                         |\n| `failed`         | An error occurred. Show the message to the user. **DO NOT** retry.                                                |\n\n### `input_required` sub-types\n\nCheck `data` to determine the reason:\n\n| `data` field                | Meaning                                                                                                    |\n| --------------------------- | ---------------------------------------------------------------------------------------------------------- |\n| `data.attestationsRequired` | Missing attestations. Show `data.attestationLinks` to the user and wait before retrying.                   |\n| `data.maxUseExceeded`       | The chosen payment has exceeded its maximum allowed uses. Go back and choose a different payment option.   |\n| `data.newPaymentRequired`   | The server returned a new 402 after payment. Call the script again with this value as `--paymentRequired`. |\n\n---\n\n## Workflow\n\n### 1. Request a resource\n\nSend a normal HTTP request to the server endpoint.\n\n### 2. Receive 402\n\nThe server returns `402 Payment Required` with a `PAYMENT-REQUIRED` header.\n\n### 3. Ensure identity exists\n\nRun `node scripts/getIdentities.js`. If no identity is configured, create one first (see `reference/identity/SKILL.md`).\n\n### 4. First call — execute payment or get payment options\n\n```bash\nnode scripts/buildX402Payment.js \\\n  --paymentRequired '<base64_or_json>'\n```\n\nThe script **never signs a payment on the first call**. Even when only one option is offered, it returns the list and waits for the user to confirm by selecting a `paymentHash`.\n\nThe script outputs `status: \"input_required\"` with two top-level fields in `data`:\n\n- `resource` — describes the protected resource the user is paying for:\n  - `resource.url` — the URL of the protected resource.\n  - `resource.description` — a human-readable description of what the resource provides.\n- `payments` — the list of payment options. Each option includes:\n  - `hash` — the payment hash (use as `--paymentHash` in the next call)\n  - `amount` — the payment amount\n  - `asset` — the asset name (e.g., \"USDC\") or contract address\n  - `network` — the network identifier (e.g., \"eip155:84532\")\n  - `requiredAttestations` — informational list of attestation schema IDs that this payment type requires in general; may be non-empty even when the user already holds all of them — **do not use this field to decide whether to block the payment**\n  - `hasAllAttestations` — `true` if the user already holds every required attestation and the payment can proceed; `false` if some are missing\n  - `attestationLinks` — verification URLs the user must complete to obtain **missing** attestations; empty when `hasAllAttestations` is `true`\n\n**Present the options to the user.** Always start by showing `resource.url` and `resource.description` so the user knows **what** they are paying for. Then show each payment option's amount, asset, network, and whether attestations are required. Ask the user to choose one payment option or decline payment.\n\n> **CRITICAL: How to read attestation status — always use `hasAllAttestations` and `attestationLinks`, never `requiredAttestations` alone**\n>\n> | `hasAllAttestations` | `attestationLinks` | What it means                                                                 |\n> | -------------------- | ------------------ | ----------------------------------------------------------------------------- |\n> | `true`               | empty              | User holds all attestations — this payment can proceed immediately.           |\n> | `false`              | non-empty          | User is missing attestations — show every link to the user before proceeding. |\n>\n> A payment option with a non-empty `requiredAttestations` but `hasAllAttestations: true` and an empty `attestationLinks` means the user **already has** all the necessary attestations. Do not block or warn about such payments.\n>\n> **CRITICAL: Attestation Links**\n> If `attestationLinks` is non-empty, you MUST display every link to the user exactly as returned.\n>\n> - **DO NOT** follow, open, or resolve the links yourself.\n> - **DO NOT** attempt to complete the attestation on behalf of the user.\n> - **DO NOT** skip or hide payment options that require attestations.\n> - Simply present each link and inform the user they must open and complete them manually.\n\n### 5. Second call — execute chosen payment\n\nThis step is **always required** — there is no fast-path that skips it, even when only one payment option was offered. Once the user selects (or confirms) a payment, call the script again with the chosen `--paymentHash`:\n\n```bash\nnode scripts/buildX402Payment.js \\\n  --paymentRequired '<same_base64_or_json>' \\\n  --paymentHash '<hash_of_chosen_payment>'\n```\n\n**If the chosen payment requires attestations the user doesn't have**: the script outputs `status: \"input_required\"` with `data.attestationsRequired: true` and `data.attestationLinks` containing verification URLs. Show these links to the user and wait for them to complete the attestation before retrying.\n\n**If attestations are satisfied (or not needed)**: the script signs the payment, sends it, and returns the result. Check the output status as described in step 4.\n\n### 6. Handle max use exceeded\n\nIf the script returns `status: \"input_required\"` with `data.maxUseExceeded: true`, the chosen payment option has been used the maximum number of times allowed by the server. **Do not retry with the same payment.** Go back to the payment selection step and ask the user to choose a different payment option from the original list.\n\n### 7. Handle new 402 (loop)\n\nIf the script returns `status: \"input_required\"` with `data.newPaymentRequired`, the server issued a new payment challenge after the first payment. **Call the script again** with the new value:\n\n```bash\nnode scripts/buildX402Payment.js \\\n  --paymentRequired '<data.newPaymentRequired value>'\n```\n\nRepeat from step 4. Continue looping until you get `success` or `failed`.\n\n---\n\n## Error Handling (CRITICAL)\n\nIf `buildX402Payment.js` returns status `failed`:\n\n- **DO NOT** retry the original request.\n- Show the error message to the user.\n- Ask the user to resolve the issue before retrying.\n\nIf `buildX402Payment.js` returns status `input_required`:\n\n- **DO NOT** make your own HTTP request to the resource.\n- Read `data` to determine what is needed:\n  - `data.attestationsRequired` — show links to user, wait, then retry\n  - `data.maxUseExceeded` — the chosen payment exceeded its max uses; go back and ask the user to pick a different payment option\n  - `data.newPaymentRequired` — call the script again with the new `--paymentRequired` value (loop)\n\n---\n\n## Examples\n\n### Standard payment flow (user confirmation required)\n\n```\nAgent: [fetches https://example.com/api/resource]\nServer: 402 Payment Required\n  Header: PAYMENT-REQUIRED: \"eyJ4NDAyVmVyc2lvbi...\"\n\nAgent: [runs getIdentities.js — confirms identity exists]\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAyVmVyc2lvbi...']\n       → { \"status\": \"input_required\", \"data\": {\n            \"resource\": { \"url\": \"https://api.example.com/weather\", \"description\": \"Weather data\" },\n            \"payments\": [\n              { \"hash\": \"a1b2c3...\", \"amount\": \"10000\", \"asset\": \"USDC\", \"network\": \"eip155:84532\",\n                \"requiredAttestations\": [], \"hasAllAttestations\": true, \"attestationLinks\": [] },\n              { \"hash\": \"d4e5f6...\", \"amount\": \"6000\", \"asset\": \"USDC\", \"network\": \"eip155:84532\",\n                \"requiredAttestations\": [\"0xca35...\"], \"hasAllAttestations\": false,\n                \"attestationLinks\": [\"https://wallet.billions.network#request_uri=...\"] }\n            ]}}\n\nAgent: \"You are about to pay for: Weather data (https://api.example.com/weather).\n        There are 2 payment options:\n        1) 10000 USDC on eip155:84532 — no attestations required\n        2) 6000 USDC on eip155:84532 — requires attestation (missing).\n           Complete verification: [link]\n        Which would you like?\"\n\nUser: \"Option 1\"\n\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAyVmVyc2lvbi...' --paymentHash 'a1b2c3...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n\nAgent: \"The weather data shows 22°C in Kyiv.\"\n```\n\n### New 402 after payment (loop)\n\n```\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJhbGciOi...']\n       → { \"status\": \"input_required\", \"data\": { \"newPaymentRequired\": \"eyJ4NDAy...\" } }\n\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAy...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n```\n\n### Attestation required (on chosen payment)\n\n```\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAy...' --paymentHash 'd4e5f6...']\n       → { \"status\": \"input_required\", \"data\": { \"attestationsRequired\": true,\n            \"message\": \"The following attestations are required to complete the payment:\",\n            \"attestationLinks\": [\"https://wallet.billions.network#request_uri=...\"] }}\n\nAgent: \"You need to complete an attestation before paying. Please open this link: [link]\"\nUser: [completes attestation]\nAgent: [retries buildX402Payment.js with same arguments]\n```\n\n### Max use exceeded\n\n```\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAyVmVyc2lvbi...' --paymentHash 'd4e5f6...']\n       → { \"status\": \"input_required\", \"data\": { \"maxUseExceeded\": true,\n            \"message\": \"Payment has exceeded its maximum allowed uses. Choose a different payment or contact the resource provider.\" }}\n\nAgent: \"The selected payment option has reached its maximum number of uses.\n        Please choose a different payment option:\n        1) 10000 USDC on eip155:84532 — no attestations required\n        Which would you like?\"\n\nUser: \"Option 1\"\n\nAgent: [runs buildX402Payment.js --paymentRequired 'eyJ4NDAyVmVyc2lvbi...' --paymentHash 'a1b2c3...']\n       → { \"status\": \"success\", \"data\": { \"temperature\": 22, \"city\": \"Kyiv\" } }\n```\n\nFile v2.0.3:SKILL.md\n\n---\nname: verified-agent-identity\ndescription: Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify and generate authentication proofs. Based on iden3 self-sovereign identity protocol.\nmetadata:\n  {\n    \"category\": \"identity\",\n    \"clawdbot\":\n      {\n        \"requires\": { \"bins\": [\"node\"] },\n        \"config\": { \"optionalEnv\": [\"BILLIONS_NETWORK_MASTER_KMS_KEY\"] },\n      },\n  }\nhomepage: https://billions.network/\n---\n\n## When to Use This Skill\n\nThis skill covers two capabilities. Read the **router table** below, then load the relevant reference before proceeding.\n\n| Situation                                                               | Reference to load             |\n| ----------------------------------------------------------------------- | ----------------------------- |\n| Create, list, link, verify, or sign with a decentralized identity (DID) | `reference/identity/SKILL.md` |\n| Handle a **402 Payment Required** HTTP response                         | `reference/x402/SKILL.md`     |\n\n> **Always read the appropriate reference SKILL.md before running any script.**\n> If a task spans both (e.g. you need an identity before you can sign a 402 payment), read both.\n\n## Quick Overview\n\n- **Identity** — Create Ethereum-based DIDs on the Billions Network, link them to a human owner, and prove ownership via challenge/response signing.\n- **x402 Payment** — When a server returns `402 Payment Required`, build a signed `PAYMENT-SIGNATURE` header so you can retry the request and gain access.\n\n## Shared Setup\n\nAll identity data is stored in `$HOME/.openclaw/billions`. Scripts live in `scripts/`.\n\n```bash\ncd scripts && npm install && cd ..\n```\n\n## Restrictions / Guardrails (CRITICAL)\n\n**These rules apply to ALL references. Always follow them.**\n\n1. **STRICT: Check Identity First**\n   - Before running `linkHumanToAgent.js`, `signChallenge.js`, or `buildX402Payment.js`, **ALWAYS** check if an identity exists: `node scripts/getIdentities.js`\n   - If no identity is configured, create one first with `createNewEthereumIdentity.js`.\n\n2. **STRICT: Stop on Script Failure**\n   - If any script exits with a non-zero status code, **STOP IMMEDIATELY**.\n   - Check stderr for error messages.\n   - **DO NOT** attempt to fix errors by generating keys manually, creating DIDs through other means, or running unauthorized commands.\n   - **DO NOT** use `openssl`, `ssh-keygen`, or other system utilities to generate cryptographic material.\n\n3. **No Manual Workarounds**\n   - You are prohibited from performing manual cryptographic operations.\n   - You are prohibited from directly manipulating files in `$HOME/.openclaw/billions`.\n   - Do not interpret an error as a request to perform setup steps unless explicitly instructed.\n\n## Security\n\nThe directory `$HOME/.openclaw/billions` contains sensitive identity data:\n\n- `kms.json` — **CRITICAL**: Contains private keys (encrypted if `BILLIONS_NETWORK_MASTER_KMS_KEY` is set, otherwise plaintext)\n- `defaultDid.json` — DID identifiers and public keys\n- `challenges.json` — Authentication challenges history\n- `credentials.json` — Verifiable credentials\n- `identities.json` — Identity metadata\n- `profiles.json` — Profile data\n\nAfter the first run, restrict access to this directory: chmod 700 ~/.openclaw/billions\n\nThere are several ways of storing private keys, to enable master key encryption as described in the KMS Encryption section below.\n\nMore about security: `./SECURITY.md`\n\nFile v2.0.3:README.md\n\n# Verified Agent Identity\n\nA decentralized identity management toolkit for AI agents using iden3 protocol on Billions Network.\n\n## Overview\n\nThis skill enables AI agents to create, manage, link, prove and verify ownership of decentralized identities (DIDs) using cryptographic signatures.\n\n## Installation\n\n### Agent CTA:\n\n1. Ask bot to install the skill:\n\n   Install with clawhub:\n\n   ```plaintext\n   Install the skill `npx clawhub@latest install verified-agent-identity`\n   ```\n\n   Or install with skills.sh:\n\n   ```plaintext\n   Intall the skill `npx skills add BillionsNetwork/verified-agent-identity`\n   ```\n\n   Or\n\n   ```plaintext\n   Install the `verified-agent-identity` skill from the OpenClaw clawhub.ai.\n   ```\n\n2. (Optional) If the verification process did not start automatically after installation, ask your bot to initialize the process by sending a message like:\n\n   ```plaintext\n   Please link your agent identity to me.\n   ```\n\n### Human CTA:\n\n1. Install the skill:\n\n   Use clawhub to install the skill:\n\n   ```bash\n   npx clawhub@latest install verified-agent-identity\n   ```\n\n   Use skills.sh to install the skill:\n\n   ```bash\n   npx skills add BillionsNetwork/verified-agent-identity\n   ```\n\n2. Create a new identity:\n\n   ```bash\n   # Generate a new key and create a new identity\n   node scripts/createNewEthereumIdentity.js\n   ```\n\n   Or\n\n   ```bash\n   # Use an existing private key to create an identity\n   BILLIONS_NETWORK_MASTER_KMS_KEY=\"<your-strong-secret>\" node scripts/createNewEthereumIdentity.js --key <your-ethereum-private-key>\n   ```\n\n   > **Warning**: Only pass a **dedicated identity key** to `--key` — never an Ethereum wallet key that holds assets. If the key file is exposed, any key stored here could be used to impersonate the agent or, if reused, to control the associated wallet.\n\n3. Generate a verification link to connect your human identity to the agent:\n\n   ```bash\n   node scripts/manualLinkHumanToAgent.js --challenge '{\"name\": \"Agent Name\", \"description\": \"Short description of the agent\"}'\n   ```\n\n   This prints the verification URL to the console. Open it in your browser to complete the identity linking process.\n\n## Features\n\n- **Identity Creation**: Generate new DIDs with random or existing Ethereum private keys\n- **Identity Management**: List and manage multiple identities with default identity support\n- **Human-Agent Linking**: Link a human identity to an agent's DID through signed challenges\n- **Proof Generation**: Generate cryptographic proofs to authenticate as a specific identity\n- **Proof Verification**: Verify proofs to confirm identity ownership\n\n## Architecture\n\n### Runtime Requirements\n\n- **Node.js `>= v20`** and **npm** are required to run the scripts.\n\n### Dependency Surface\n\nnpm dependencies are intentionally minimal and scoped to well-established, audited packages:\n\n| Package                | Purpose                                                      |\n| ---------------------- | ------------------------------------------------------------ |\n| `@0xpolygonid/js-sdk`  | iden3/Privado ID cryptographic primitives and key management |\n| `@iden3/js-iden3-core` | DID and identity core types                                  |\n| `@iden3/js-iden3-auth` | JWS/JWA authorization response construction and verification |\n| `ethers`               | Ethereum key utilities                                       |\n| `uuid`                 | UUID generation for protocol message IDs                     |\n\nCore libraries governing identity management use pinned, well-tested versions to ensure stability and security.\n\n### Key Storage and Isolation\n\nAll cryptographic material is persisted to `$HOME/.openclaw/billions/` — a directory that lives **outside the agent's workspace**:\n\n| File               | Contents                                                                           |\n| ------------------ | ---------------------------------------------------------------------------------- |\n| `kms.json`         | Private keys — per-entry versioned format; keys are plain or AES-256-GCM encrypted |\n| `identities.json`  | Identity metadata                                                                  |\n| `defaultDid.json`  | Active DID and associated public key                                               |\n| `challenges.json`  | Per-DID challenge history                                                          |\n| `credentials.json` | Verifiable credentials                                                             |\n\nAfter the first run, restrict access to this directory: `chmod 700 ~/.openclaw/billions`\n\nThere are several ways of storing private keys, to enable master key encryption as described in the **KMS Encryption** section below.\n\n### KMS Encryption\n\n> See [SECURITY.md](SECURITY.md) for the full threat model, the rationale for shipping a plaintext storage mode, and the operator hardening checklist.\n\nSet the environment variable `BILLIONS_NETWORK_MASTER_KMS_KEY` to enable AES-256-GCM at-rest encryption for the private keys inside `kms.json`. When set, every key value is individually encrypted on write; when absent, keys are stored as plain hex strings.\n\n**`kms.json` entry format**\n\nEach entry in the array is versioned. The `alias` is always stored in plaintext — only the `key` value is encrypted:\n\n```json\n[\n  {\n    \"version\": 1,\n    \"provider\": \"plain\",\n    \"data\": {\n      \"alias\": \"secp256k1:abc123\",\n      \"key\": \"deadbeef...\",\n      \"createdAt\": \"2026-03-12T13:46:04.094Z\"\n    }\n  },\n  {\n    \"version\": 1,\n    \"provider\": \"encrypted\",\n    \"data\": {\n      \"alias\": \"secp256k1:xyz456\",\n      \"key\": \"<iv_hex>:<authTag_hex>:<ciphertext_hex>\",\n      \"createdAt\": \"2026-02-11T13:00:02.032Z\"\n    }\n  }\n]\n```\n\n**Behavior summary**\n\n| `BILLIONS_NETWORK_MASTER_KMS_KEY` | `provider` on disk | `key` value on disk     |\n| --------------------------------- | ------------------ | ----------------------- |\n| Not set                           | `\"plain\"`          | Raw hex string          |\n| Set                               | `\"encrypted\"`      | `iv:authTag:ciphertext` |\n\n> **Backward compatibility** — the legacy format `[ { \"alias\": \"...\", \"privateKeyHex\": \"...\" } ]` is still read correctly. On the first write the file is automatically migrated to the new per-entry format. No manual step is required.\n\n**How to set the variable**\n\n_Option 1 — openclaw skill config (recommended for agent deployments):_\n\nAdd an `env` block for the skill inside your openclaw config:\n\n```json\n\"skills\": {\n  \"entries\": {\n    \"verified-agent-identity\": {\n      \"env\": {\n        \"BILLIONS_NETWORK_MASTER_KMS_KEY\": \"<your-strong-secret>\"\n      }\n    }\n  }\n}\n```\n\n_Option 2 — shell or process environment:_\n\n```bash\nexport BILLIONS_NETWORK_MASTER_KMS_KEY=\"<your-strong-secret>\"\nnode scripts/createNewEthereumIdentity.js\nnode scripts/manualLinkHumanToAgent.js --challenge '{\"name\": \"Agent Name\", \"description\": \"Short description of the agent\"}'\n```\n\nFor all other ways to pass environment variables to a skill see the [OpenClaw environment documentation](https://docs.openclaw.ai/help/environment).\n\n**CRITICAL**: Save master keys securely and do not share them. If the master key is lost, all encrypted keys will be lost.\n\n### Network and External Binary Policy\n\n- All external https calls will be made to trusted resources. Signed JWS attestation (proof of agent ownership) is encoded securely by utilizing robust security practices. It requires an explicit user consent to pass it to any other source.\n- All network calls are directed to legitimate DID resolvers (resolver.privado.id) or the project's own infrastructure (billions.network). These network calls cannot exfiltrate signed attestations or identity data to other third-party services by skill design. Wallet interaction is possible only through explicit action from the user side with consent. Also attestation contains only publicly verifiable information.\n- Whitelisted domains:\n  - `resolver.privado.id` (DID resolution)\n  - `billions.network` (Billions Network interactions)\n  - `polygonid.me` (Polygon ID interactions)\n\n## Documentation\n\nSee [SKILL.md](SKILL.md) for detailed usage instructions and examples.\n\nFile v2.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7b32r236rckzwn88kc1jqhcn81hzrv\",\n  \"slug\": \"identity\",\n  \"version\": \"2.0.3\",\n  \"publishedAt\": 1778769884670\n}\n\nFile v2.0.3:scripts/package-lock.json\n\n{\n  \"name\": \"verified-agent-identity\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"verified-agent-identity\",\n      \"version\": \"1.0.0\",\n      \"license\": \"UNLICENSED\",\n      \"dependencies\": {\n        \"@0xpolygonid/js-sdk\": \"1.42.1\",\n        \"@billionsnetwork/x402-human-proof-client\": \"^0.1.6\",\n        \"@iden3/js-iden3-auth\": \"1.14.0\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@x402/core\": \"2.9.0\",\n        \"@x402/evm\": \"2.9.0\",\n        \"ethers\": \"6.13.4\",\n        \"uuid\": \"11.0.3\",\n        \"viem\": \"2.47.6\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk\": {\n      \"version\": \"1.42.1\",\n      \"resolved\": \"https://registry.npmjs.org/@0xpolygonid/js-sdk/-/js-sdk-1.42.1.tgz\",\n      \"integrity\": \"sha512-2X0zFGfygtu4D7X2DSiI3GxQ7vp3+iNQ05WeTi4u9aPj+9/sxYsVDJnRsHDZzmCCVO9kzmb2DQ1uxs5JtTrhPA==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@iden3/onchain-non-merklized-issuer-base-abi\": \"0.0.3\",\n        \"@iden3/universal-verifier-v2-abi\": \"2.0.2\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@solana/web3.js\": \"1.98.4\",\n        \"ajv\": \"8.17.1\",\n        \"ajv-formats\": \"3.0.1\",\n        \"borsh\": \"0.7.0\",\n        \"canonicalize\": \"^2.1.0\",\n        \"did-jwt\": \"8.0.18\",\n        \"did-resolver\": \"4.1.0\",\n        \"ethers\": \"6.15.0\",\n        \"idb-keyval\": \"6.2.2\",\n        \"jose\": \"^6.1.0\",\n        \"jsonld\": \"8.3.3\",\n        \"pubsub-js\": \"1.9.5\",\n        \"quick-lru\": \"7.0.1\",\n        \"uuid\": \"13.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/ethers\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz\",\n      \"integrity\": \"sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/ethers-io/\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@adraffy/ens-normalize\": \"1.10.1\",\n        \"@noble/curves\": \"1.2.0\",\n        \"@noble/hashes\": \"1.3.2\",\n        \"@types/node\": \"22.7.5\",\n        \"aes-js\": \"4.0.0-beta.5\",\n        \"tslib\": \"2.7.0\",\n        \"ws\": \"8.17.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/ethers/node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/tslib\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz\",\n      \"integrity\": \"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/@0xpolygonid/js-sdk/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/@adraffy/ens-normalize\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz\",\n      \"integrity\": \"sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@babel/runtime\": {\n      \"version\": \"7.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz\",\n      \"integrity\": \"sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client\": {\n      \"version\": \"0.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/@billionsnetwork/x402-human-proof-client/-/x402-human-proof-client-0.1.6.tgz\",\n      \"integrity\": \"sha512-RYXfJi06Itq0ND2ZGNcvNIIPM+MbA/+EPoIgGBJlK0jfPFMRGUI441+gL1koZJjygDe6NnlZay4rKwe7sztDKQ==\",\n      \"license\": \"UNLICENSED\",\n      \"dependencies\": {\n        \"@0xpolygonid/js-sdk\": \"^1.43.0\",\n        \"@iden3/js-iden3-core\": \"^1.8.0\",\n        \"@x402/core\": \"^2.9.0\",\n        \"bs58\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/@0xpolygonid/js-sdk\": {\n      \"version\": \"1.43.0\",\n      \"resolved\": \"https://registry.npmjs.org/@0xpolygonid/js-sdk/-/js-sdk-1.43.0.tgz\",\n      \"integrity\": \"sha512-Zsf92vtAtjPY4Fx0lJ0PZXr4AzhmZ0aqlPrKF283gyQJt3LIZLf9wdD9VaSI/rF7hlLi2mCuyj5zSOoNWlEbtQ==\",\n      \"license\": \"MIT or Apache-2.0\",\n      \"dependencies\": {\n        \"@iden3/onchain-non-merklized-issuer-base-abi\": \"0.0.3\",\n        \"@iden3/universal-verifier-v2-abi\": \"2.0.2\",\n        \"@noble/curves\": \"1.9.2\",\n        \"@solana/web3.js\": \"1.98.4\",\n        \"ajv\": \"8.17.1\",\n        \"ajv-formats\": \"3.0.1\",\n        \"borsh\": \"0.7.0\",\n        \"canonicalize\": \"^2.1.0\",\n        \"did-jwt\": \"8.0.18\",\n        \"did-resolver\": \"4.1.0\",\n        \"ethers\": \"6.15.0\",\n        \"idb-keyval\": \"6.2.2\",\n        \"jose\": \"^6.1.0\",\n        \"jsonld\": \"8.3.3\",\n        \"pubsub-js\": \"1.9.5\",\n        \"quick-lru\": \"7.0.1\",\n        \"uuid\": \"13.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      },\n      \"peerDependencies\": {\n        \"@iden3/js-crypto\": \"1.3.2\",\n        \"@iden3/js-iden3-core\": \"1.8.0\",\n        \"@iden3/js-jsonld-merklization\": \"1.7.2\",\n        \"@iden3/js-jwz\": \"1.12.2\",\n        \"@iden3/js-merkletree\": \"1.5.1\",\n        \"ffjavascript\": \"0.3.1\",\n        \"rfc4648\": \"1.5.4\",\n        \"snarkjs\": \"0.7.5\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/@noble/hashes\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz\",\n      \"integrity\": \"sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/ethers\": {\n      \"version\": \"6.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz\",\n      \"integrity\": \"sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/ethers-io/\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@adraffy/ens-normalize\": \"1.10.1\",\n        \"@noble/curves\": \"1.2.0\",\n        \"@noble/hashes\": \"1.3.2\",\n        \"@types/node\": \"22.7.5\",\n        \"aes-js\": \"4.0.0-beta.5\",\n        \"tslib\": \"2.7.0\",\n        \"ws\": \"8.17.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/ethers/node_modules/@noble/curves\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz\",\n      \"integrity\": \"sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@noble/hashes\": \"1.3.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/tslib\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz\",\n      \"integrity\": \"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/@billionsnetwork/x402-human-proof-client/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/@digitalbazaar/http-client\": {\n      \"version\": \"3.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz\",\n      \"integrity\": \"sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"ky\": \"^0.33.3\",\n        \"ky-universal\": \"^0.11.0\",\n        \"undici\": \"^5.21.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abi\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz\",\n      \"integrity\": \"sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/hash\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/strings\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abstract-provider\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz\",\n      \"integrity\": \"sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/networks\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\",\n        \"@ethersproject/web\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/abstract-signer\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz\",\n      \"integrity\": \"sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/address\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz\",\n      \"integrity\": \"sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/keccak256\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/rlp\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/base64\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz\",\n      \"integrity\": \"sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/basex\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz\",\n      \"integrity\": \"sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/bignumber\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz\",\n      \"integrity\": \"sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"bn.js\": \"^5.2.1\"\n      }\n    },\n    \"node_modules/@ethersproject/bytes\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz\",\n      \"integrity\": \"sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/logger\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/constants\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz\",\n      \"integrity\": \"sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/bignumber\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/contracts\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz\",\n      \"integrity\": \"sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.buymeacoffee.com/ricmoo\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@ethersproject/abi\": \"^5.8.0\",\n        \"@ethersproject/abstract-provider\": \"^5.8.0\",\n        \"@ethersproject/abstract-signer\": \"^5.8.0\",\n        \"@ethersproject/address\": \"^5.8.0\",\n        \"@ethersproject/bignumber\": \"^5.8.0\",\n        \"@ethersproject/bytes\": \"^5.8.0\",\n        \"@ethersproject/constants\": \"^5.8.0\",\n        \"@ethersproject/logger\": \"^5.8.0\",\n        \"@ethersproject/properties\": \"^5.8.0\",\n        \"@ethersproject/transactions\": \"^5.8.0\"\n      }\n    },\n    \"node_modules/@ethersproject/hash\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz\",\n      \"integrity\": \"sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfv\n\nArchive v2.0.2: 31 files, 63439 bytes\n\nFiles: README.md (8190b), reference/identity/SKILL.md (4669b), reference/x402/SKILL.md (12012b), scripts/buildX402Payment.js (8111b), scripts/createNewEthereumIdentity.js (1835b), scripts/generateChallenge.js (742b), scripts/getDidDocument.js (593b), scripts/getIdentities.js (521b), scripts/linkHumanToAgent.js (1746b), scripts/manualLinkHumanToAgent.js (675b), scripts/package-lock.json (122868b), scripts/package.json (662b), scripts/shared/attestation.js (2230b), scripts/shared/bootstrap.js (4099b), scripts/shared/constants.js (1871b), scripts/shared/scopes.js (1036b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils/auth.js (2750b), scripts/shared/utils/cli.js (1240b), scripts/shared/utils/did.js (1068b), scripts/shared/utils/index.js (1264b), scripts/signChallenge.js (2042b), scripts/verifySignature.js (1930b), SECURITY.md (8221b), SKILL.md (3556b), _meta.json (127b)\n\nArchive v2.0.1: 31 files, 63130 bytes\n\nFiles: README.md (8145b), reference/identity/SKILL.md (4669b), reference/x402/SKILL.md (11292b), scripts/buildX402Payment.js (7740b), scripts/createNewEthereumIdentity.js (1835b), scripts/generateChallenge.js (742b), scripts/getDidDocument.js (593b), scripts/getIdentities.js (521b), scripts/linkHumanToAgent.js (1746b), scripts/manualLinkHumanToAgent.js (675b), scripts/package-lock.json (122868b), scripts/package.json (662b), scripts/shared/attestation.js (2230b), scripts/shared/bootstrap.js (4099b), scripts/shared/constants.js (1871b), scripts/shared/scopes.js (1036b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils/auth.js (2750b), scripts/shared/utils/cli.js (1240b), scripts/shared/utils/did.js (1068b), scripts/shared/utils/index.js (1264b), scripts/signChallenge.js (2042b), scripts/verifySignature.js (1930b), SECURITY.md (8221b), SKILL.md (3556b), _meta.json (127b)\n\nArchive v2.0.0: 31 files, 63176 bytes\n\nFiles: README.md (8145b), reference/identity/SKILL.md (4669b), reference/x402/SKILL.md (12044b), scripts/buildX402Payment.js (7728b), scripts/createNewEthereumIdentity.js (1835b), scripts/generateChallenge.js (742b), scripts/getDidDocument.js (593b), scripts/getIdentities.js (521b), scripts/linkHumanToAgent.js (1746b), scripts/manualLinkHumanToAgent.js (675b), scripts/package-lock.json (122868b), scripts/package.json (662b), scripts/shared/attestation.js (2230b), scripts/shared/bootstrap.js (4099b), scripts/shared/constants.js (1871b), scripts/shared/scopes.js (1036b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils/auth.js (2750b), scripts/shared/utils/cli.js (1240b), scripts/shared/utils/did.js (1068b), scripts/shared/utils/index.js (1264b), scripts/signChallenge.js (2042b), scripts/verifySignature.js (1930b), SECURITY.md (8221b), SKILL.md (3556b), _meta.json (127b)\n\nArchive v1.0.0: 24 files, 53070 bytes\n\nFiles: README.md (8145b), scripts/constants.js (1028b), scripts/createNewEthereumIdentity.js (2138b), scripts/generateChallenge.js (806b), scripts/getDidDocument.js (923b), scripts/getIdentities.js (572b), scripts/linkHumanToAgent.js (4031b), scripts/manualLinkHumanToAgent.js (766b), scripts/package-lock.json (109645b), scripts/package.json (531b), scripts/shared/attestation.js (2303b), scripts/shared/bootstrap.js (4031b), scripts/shared/storage/base.js (872b), scripts/shared/storage/challenge.js (1211b), scripts/shared/storage/crypto.js (2139b), scripts/shared/storage/did.js (1097b), scripts/shared/storage/identities.js (1113b), scripts/shared/storage/keys.js (3437b), scripts/shared/utils.js (3013b), scripts/signChallenge.js (2403b), scripts/verifySignature.js (2030b), SECURITY.md (8221b), SKILL.md (8367b), _meta.json (127b)","readmeExcerpt":"Skill: Verified Agent Identity Owner: billionsnetwork Summary: Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify... Tags: latest:2.0.4 Version history: v2.0.4 | 2026-05-18T09:34:42.234Z | auto Identity Skill 2.0.4 - Clarified the identity setup workflow: after creating a new Ethereum identity, you must run link","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Generate a new random identity\nnode scripts/createNewEthereumIdentity.js\n\n# Create identity from existing private key\nnode scripts/createNewEthereumIdentity.js --key 0x1234567890abcdef..."},{"language":"bash","snippet":"node scripts/getIdentities.js"},{"language":"json","snippet":"[\n  {\n    \"did\": \"did:iden3:billions:main:2VmAk...\",\n    \"publicKeyHex\": \"0x04abc123...\",\n    \"isDefault\": true\n  }\n]"},{"language":"bash","snippet":"node scripts/linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"AI persona\"}'"},{"language":"bash","snippet":"node scripts/generateChallenge.js --did did:iden3:billions:main:2VmAk..."},{"language":"bash","snippet":"node scripts/signChallenge.js --challenge 8472951360"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"reference/identity/SKILL.md","content":"# Identity Reference\n\nManage decentralized identities (DIDs) on the Billions Network — create, list, link to a human owner, and verify ownership.\n\n## When to Use\n\n- You need to create a new agent identity.\n- You need to link your agent identity to a human owner.\n- You need to sign a challenge to prove identity ownership.\n- You need to verify someone else's identity.\n- You need to list existing local identities.\n\n## Scripts\n\n### createNewEthereumIdentity.js\n\n**Command**: `node scripts/createNewEthereumIdentity.js [--key <privateKeyHex>]`\n\nCreates a new identity on the Billions Network. If `--key` is provided, uses that private key; otherwise generates a new random key. The created identity is automatically set as default.\n\n```bash\n# Generate a new random identity\nnode scripts/createNewEthereumIdentity.js\n\n# Create identity from existing private key\nnode scripts/createNewEthereumIdentity.js --key 0x1234567890abcdef...\n```\n\n**Output**: DID string (e.g., `did:iden3:billions:main:2VmAk7fGHQP5FN2jZ8X9Y3K4W6L1M...`)\n\n---\n\n### getIdentities.js\n\n**Command**: `node scripts/getIdentities.js`\n\nLists all DID identities stored locally. **Always run this before any signing or linking operation.**\n\n```bash\nnode scripts/getIdentities.js\n```\n\n**Output**: JSON array of identity entries\n\n```json\n[\n  {\n    \"did\": \"did:iden3:billions:main:2VmAk...\",\n    \"publicKeyHex\": \"0x04abc123...\",\n    \"isDefault\": true\n  }\n]\n```\n\n---\n\n### linkHumanToAgent.js\n\n**Command**: `node scripts/linkHumanToAgent.js --challenge <challenge> [--did <did>]`\n\nSigns the challenge and links a human user to the agent's DID by creating a verification request. Uses the Billions ERC-8004 Registry (agent registration) and the Billions Attestation Registry (ownership attestation after verifying human uniqueness).\n\n- `--challenge` — (required) Challenge to sign. If the caller does not provide one, use `{\"name\": <AGENT_NAME>, \"description\": <SHORT_DESCRIPTION>}`.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/linkHumanToAgent.js --challenge '{\"name\": \"MyAgent\", \"description\": \"AI persona\"}'\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### generateChallenge.js\n\n**Command**: `node scripts/generateChallenge.js --did <did>`\n\nGenerates a random challenge for identity verification. Stores the challenge in `$HOME/.openclaw/billions/challenges.json`.\n\n```bash\nnode scripts/generateChallenge.js --did did:iden3:billions:main:2VmAk...\n```\n\n**Output**: Challenge string (e.g., `8472951360`)\n\n---\n\n### signChallenge.js\n\n**Command**: `node scripts/signChallenge.js --challenge <challenge> [--did <did>]`\n\nSigns a challenge with a DID's private key to prove identity ownership and sends the JWS token.\n\n- `--challenge` — (required) Challenge to sign.\n- `--did` — (optional) Uses the default DID if omitted.\n\n```bash\nnode scripts/signChallenge.js --challenge 8472951360\n```\n\n**Output**: `{\"success\":true}`\n\n---\n\n### verifySignature.js\n\n**Command**: `node scripts/verifySignature.js --did <did> --token <t"},{"path":"reference/x402/SKILL.md","content":"# x402 Payment Reference\n\nHandle `402 Payment Required` HTTP responses by executing payment and fetching the protected resource.\n\n## When to Use\n\n- The user wants to access a resource that returns **HTTP 402 Payment Required** with a `PAYMENT-REQUIRED` header — either known in advance or discovered by a previous attempt.\n- Do not pre-fetch the resource yourself to \"check\" — phase 1 of the script does the fetch.\n\n## Script\n\n### buildX402Payment.js\n\n**Command (phase 1 — discover)**: `node scripts/buildX402Payment.js --resource <url> [--did <did>]`\n**Command (phase 2 — execute)**: `node scripts/buildX402Payment.js --paymentRequiredFilePath <path> --paymentHash <hash> [--did <did>]`\n**Hint**: **NEVER reuse or cache a previous response from this script.** Every invocation produces unique, time-sensitive output (nonces, signatures, payment tokens). Always execute the script again to get a fresh result — even if the arguments are identical to a prior call.\n\nExecutes the x402 payment flow in two strictly separated phases.\n\n- **Phase 1** (`--resource` only): the script fetches the resource, expects a `402` response with a `PAYMENT-REQUIRED` header, caches the decoded challenge to a temp file named by its SHA-256 hash, and returns the available payment options together with the cached file path. It never signs a payment.\n- **Phase 2** (`--paymentRequiredFilePath` + `--paymentHash`): the script reads the cached challenge file, looks up the chosen payment option by its `--paymentHash`, signs the payment, sends the `PAYMENT-SIGNATURE` header to the resource, and returns the result.\n\n- `--resource` — (phase 1 only) The URL of the protected resource. The script fetches it and expects HTTP 402 with a `PAYMENT-REQUIRED` header. If the response is any other status, or the header is missing, the script returns status `failed`. Cannot be combined with `--paymentRequiredFilePath` or `--paymentHash`.\n- `--paymentRequiredFilePath` — (phase 2 only) Absolute path to the cached payment-required JSON file returned by phase 1. Must be combined with `--paymentHash`. Mutually exclusive with `--resource`.\n- `--paymentHash` — (phase 2 only, required) The SHA-256 hash of the chosen payment option from phase 1. Always required on phase 2, even when only one option was offered. Cannot be passed with `--resource`.\n- `--did` — (optional) The DID of the signer. Omit unless the user has explicitly asked to pay from a specific DID — the script falls back to the default DID from `getIdentities.js`, which is correct for normal use. Do not prompt the user for a DID on your own.\n\nYou **must** pick exactly one phase per invocation. Passing `--resource` together with `--paymentHash` (or with `--paymentRequiredFilePath`) is rejected.\n\n---\n\n## Output\n\nThe script always outputs JSON to stdout with a top-level `status` of `success`, `failed`, or `input_required`. See [Handling output](#handling-output) below for the action to take on each.\n\n---\n\n## Workflow\n\n### 1. Trigger\n\nUse this skill whenev"},{"path":"SKILL.md","content":"---\nname: verified-agent-identity\ndescription: Know Your Agent (KYA). Billions decentralized identity for agents. Link agents to human identities using Billions ERC-8004 and Attestation Registries. Verify and generate authentication proofs. Based on iden3 self-sovereign identity protocol.\nmetadata:\n  {\n    \"category\": \"identity\",\n    \"clawdbot\":\n      {\n        \"requires\": { \"bins\": [\"node\"] },\n        \"config\": { \"optionalEnv\": [\"BILLIONS_NETWORK_MASTER_KMS_KEY\"] },\n      },\n  }\nhomepage: https://billions.network/\n---\n\n## When to Use This Skill\n\nThis skill covers two capabilities. Read the **router table** below, then load the relevant reference before proceeding.\n\n| Situation                                                               | Reference to load             |\n| ----------------------------------------------------------------------- | ----------------------------- |\n| Create, list, link, verify, or sign with a decentralized identity (DID) | `reference/identity/SKILL.md` |\n| Handle a **402 Payment Required** HTTP response                         | `reference/x402/SKILL.md`     |\n\n> **Always read the appropriate reference SKILL.md before running any script.**\n> If a task spans both (e.g. you need an identity before you can sign a 402 payment), read both.\n\n## Quick Overview\n\n- **Identity** — Create Ethereum-based DIDs on the Billions Network, link them to a human owner, and prove ownership via challenge/response signing.\n- **x402 Payment** — When a server returns `402 Payment Required`, build a signed `PAYMENT-SIGNATURE` header so you can retry the request and gain access.\n\n## Shared Setup\n\nAll identity data is stored in `$HOME/.openclaw/billions`. Scripts live in `scripts/`.\n\n```bash\ncd scripts && npm install && cd ..\n```\n\n## Restrictions / Guardrails (CRITICAL)\n\n**These rules apply to ALL references. Always follow them.**\n\n1. **STRICT: Check Identity First**\n   - Before running `linkHumanToAgent.js`, `signChallenge.js`, or `buildX402Payment.js`, **ALWAYS** check if an identity exists: `node scripts/getIdentities.js`\n   - If no identity is configured, create one first with `createNewEthereumIdentity.js` after that run `linkHumanToAgent.js` to link it to a human owner.\n   - Continue processing the task only after confirming that an identity exists and is linked to a human owner.\n\n2. **STRICT: Stop on Script Failure**\n   - If any script exits with a non-zero status code, **STOP IMMEDIATELY**.\n   - Check stderr for error messages.\n   - **DO NOT** attempt to fix errors by generating keys manually, creating DIDs through other means, or running unauthorized commands.\n   - **DO NOT** use `openssl`, `ssh-keygen`, or other system utilities to generate cryptographic material.\n\n3. **No Manual Workarounds**\n   - You are prohibited from performing manual cryptographic operations.\n   - You are prohibited from directly manipulating files in `$HOME/.openclaw/billions`.\n   - Do not interpret an error as a request to perform setup steps unless explicitly"},{"path":"README.md","content":"# Verified Agent Identity\n\nA decentralized identity management toolkit for AI agents using iden3 protocol on Billions Network.\n\n## Overview\n\nThis skill enables AI agents to create, manage, link, prove and verify ownership of decentralized identities (DIDs) using cryptographic signatures.\n\n## Installation\n\n### Agent CTA:\n\n1. Ask bot to install the skill:\n\n   Install with clawhub:\n\n   ```plaintext\n   Install the skill `npx clawhub@latest install verified-agent-identity`\n   ```\n\n   Or install with skills.sh:\n\n   ```plaintext\n   Intall the skill `npx skills add BillionsNetwork/verified-agent-identity`\n   ```\n\n   Or\n\n   ```plaintext\n   Install the `verified-agent-identity` skill from the OpenClaw clawhub.ai.\n   ```\n\n2. (Optional) If the verification process did not start automatically after installation, ask your bot to initialize the process by sending a message like:\n\n   ```plaintext\n   Please link your agent identity to me.\n   ```\n\n### Human CTA:\n\n1. Install the skill:\n\n   Use clawhub to install the skill:\n\n   ```bash\n   npx clawhub@latest install verified-agent-identity\n   ```\n\n   Use skills.sh to install the skill:\n\n   ```bash\n   npx skills add BillionsNetwork/verified-agent-identity\n   ```\n\n2. Create a new identity:\n\n   ```bash\n   # Generate a new key and create a new identity\n   node scripts/createNewEthereumIdentity.js\n   ```\n\n   Or\n\n   ```bash\n   # Use an existing private key to create an identity\n   BILLIONS_NETWORK_MASTER_KMS_KEY=\"<your-strong-secret>\" node scripts/createNewEthereumIdentity.js --key <your-ethereum-private-key>\n   ```\n\n   > **Warning**: Only pass a **dedicated identity key** to `--key` — never an Ethereum wallet key that holds assets. If the key file is exposed, any key stored here could be used to impersonate the agent or, if reused, to control the associated wallet.\n\n3. Generate a verification link to connect your human identity to the agent:\n\n   ```bash\n   node scripts/manualLinkHumanToAgent.js --challenge '{\"name\": \"Agent Name\", \"description\": \"Short description of the agent\"}'\n   ```\n\n   This prints the verification URL to the console. Open it in your browser to complete the identity linking process.\n\n## Features\n\n- **Identity Creation**: Generate new DIDs with random or existing Ethereum private keys\n- **Identity Management**: List and manage multiple identities with default identity support\n- **Human-Agent Linking**: Link a human identity to an agent's DID through signed challenges\n- **Proof Generation**: Generate cryptographic proofs to authenticate as a specific identity\n- **Proof Verification**: Verify proofs to confirm identity ownership\n\n## Architecture\n\n### Runtime Requirements\n\n- **Node.js `>= v20`** and **npm** are required to run the scripts.\n\n### Dependency Surface\n\nnpm dependencies are intentionally minimal and scoped to well-established, audited packages:\n\n| Package                | Purpose                                                      |\n| ---------------------- | -----------------------------------"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7b32r236rckzwn88kc1jqhcn81hzrv\",\n  \"slug\": \"identity\",\n  \"version\": \"2.0.4\",\n  \"publishedAt\": 1779096882234\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2054,"uniquenessScore":37,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T03:46:17.839Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:35:58.662Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}