A decentralized identity management toolkit for AI agents using iden3 protocol on Billions Network.
$ npx -y skills add billionsnetwork/verified-agent-identity --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: billionsnetwork/verified-agent-identity
What's inside
A decentralized identity management toolkit for AI agents using iden3 protocol on Billions Network.
This skill enables AI agents to create, manage, link, prove and verify ownership of decentralized identities (DIDs) using cryptographic signatures.
Ask bot to install the skill:
Install with clawhub:
Install the skill `npx clawhub@latest install verified-agent-identity`
Or install with skills.sh:
Intall the skill `npx skills add BillionsNetwork/verified-agent-identity`
Or
Install the `verified-agent-identity` skill from the OpenClaw clawhub.ai.
(Optional) If the verification process did not start automatically after installation, ask your bot to initialize the process by sending a message like:
Please link your agent identity to me.
Install the skill:
Use clawhub to install the skill:
npx clawhub@latest install verified-agent-identity
Use skills.sh to install the skill:
npx skills add BillionsNetwork/verified-agent-identity
Create a new identity:
# Generate a new key and create a new identity
node scripts/createNewEthereumIdentity.js
Or
# Use an existing private key to create an identity
BILLIONS_NETWORK_MASTER_KMS_KEY="<your-strong-secret>" node scripts/createNewEthereumIdentity.js --key <your-ethereum-private-key>
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.
Generate a verification link to connect your human identity to the agent:
node scripts/manualLinkHumanToAgent.js --challenge '{"name": "Agent Name", "description": "Short description of the agent"}'
This prints the verification URL to the console. Open it in your browser to complete the identity linking process.
>= v20 and npm are required to run the scripts.npm dependencies are intentionally minimal and scoped to well-established, audited packages:
| Package | Purpose |
|---|---|
@0xpolygonid/js-sdk | iden3/Privado ID cryptographic primitives and key management |
@iden3/js-iden3-core | DID and identity core types |
@iden3/js-iden3-auth | JWS/JWA authorization response construction and verification |
ethers | Ethereum key utilities |
uuid | UUID generation for protocol message IDs |
Core libraries governing identity management use pinned, well-tested versions to ensure stability and security.
All cryptographic material is persisted to $HOME/.openclaw/billions/ โ a directory that lives outside the agent's workspace:
| File | Contents |
|---|---|
kms.json | Private keys โ per-entry versioned format; keys are plain or AES-256-GCM encrypted |
identities.json | Identity metadata |
defaultDid.json | Active DID and associated public key |
challenges.json | Per-DID challenge history |
credentials.json | Verifiable credentials |
After the first run, restrict access to this directory: chmod 700 ~/.openclaw/billions
There are several ways of storing private keys, to enable master key encryption as described in the KMS Encryption section below.
See SECURITY.md for the full threat model, the rationale for shipping a plaintext storage mode, and the operator hardening checklist.
Set 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.
kms.json entry format
Each entry in the array is versioned. The alias is always stored in plaintext โ only the key value is encrypted:
[
{
"version": 1,
"provider": "plain",
"data": {
"alias": "secp256k1:abc123",
"key": "deadbeef...",
"createdAt": "2026-03-12T13:46:04.094Z"
}
},
{
"version": 1,
"provider": "encrypted",
"data": {
"alias": "secp256k1:xyz456",
"key": "<iv_hex>:<authTag_hex>:<ciphertext_hex>",
"createdAt": "2026-02-11T13:00:02.032Z"
}
}
]
Behavior summary
BILLIONS_NETWORK_MASTER_KMS_KEY | provider on disk | key value on disk |
|---|---|---|
| Not set | "plain" | Raw hex string |
| Set | "encrypted" | iv:authTag:ciphertext |
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.
How to set the variable
Option 1 โ openclaw skill config (recommended for agent deployments):
Add an env block for the skill inside your openclaw config:
"skills": {
"entries": {
"verified-agent-identity": {
"env": {
"BILLIONS_NETWORK_MASTER_KMS_KEY": "<your-strong-secret>"
}
}
}
}
Option 2 โ shell or process environment:
export BILLIONS_NETWORK_MASTER_KMS_KEY="<your-strong-secret>"
node scripts/createNewEthereumIdentity.js
node scripts/manualLinkHumanToAgent.js --challenge '{"name": "Agent Name", "description": "Short description of the agent"}'
For all other ways to pass environment variables to a skill see the OpenClaw environment documentation.
CRITICAL: Save master keys securely and do not share them. If the master key is lost, all encrypted keys will be lost.
resolver.privado.id (DID resolution)billions.network (Billions Network interactions)polygonid.me (Polygon ID interactions)See SKILL.md for detailed usage instructions and examples.
.clawhubignore
.github/
workflows/
evaluate-skill.yml
publish.yml
.gitignore
prompt.json
promptfooconfig.yaml
README.md
reference/
identity/
SKILL.md
x402/
SKILL.md
scripts/
buildX402Payment.js
createNewEthereumIdentity.js
generateChallenge.js
getDidDocument.js
getIdentities.js
linkHumanToAgent.js
manualLinkHumanToAgent.js
package-lock.json
package.json
shared/
attestation.js
bootstrap.js
constants.js
scopes.js
storage/
base.js
challenge.js
crypto.js
did.js
identities.js
keys.js
utils/
auth.js
cli.js
did.js
index.js
signChallenge.js
verifySignature.js
SECURITY.md
SKILL.mdFAQ
verified-agent-identity is a Claude Code plugin with 1 hand-picked skill for security work, indexed on Flowy. Install it with the command on its page. It includes verified-agent-identity. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.