Install
openclaw skills install soulblockRead, list, mint, and append Soul Block NFT identities on Base; read works without a wallet, writes use evm-wallet or fallback website links.
openclaw skills install soulblockRead, mint, and develop Soul Block identities on Base.
The skill connects to the SoulBlocks contract on Base mainnet by default. No configuration is needed for standard use.
To override the defaults (e.g., for testnet), set environment variables:
export SOULBLOCKS_CONTRACT_ADDRESS=0x... # overrides built-in mainnet address
export SOULBLOCK_RPC_URL=https://... # overrides https://mainnet.base.org
Before using this skill — especially with a real wallet — we recommend having your AI agent review the source code of both this skill and the evm-wallet dependency:
scripts/fetch.ts, scripts/encode.js, and this SKILL.md. All read operations use only public RPC calls. Write operations are passed to evm-wallet.clawhub install evm-wallet --version 1.0.3.Ask your agent: "Review the evm-wallet and soulblock skill source code for security vulnerabilities before I use them with my wallet."
⚠️ Treat any agent-connected wallet as a hot wallet. Keep only small amounts. Never store significant holdings in a wallet accessible to AI agents.
Write commands (list, mint, append) can use either of two methods.
Install from ClawHub (pinned to reviewed version):
clawhub install evm-wallet --version 1.0.3
ClawHub page: https://clawhub.ai/surfer77/evm-wallet
Check if evm-wallet is available:
EVM_WALLET_DIR=$(ls -d \
~/openclaw/skills/evm-wallet \
~/OpenClaw/skills/evm-wallet \
~/clawd/skills/evm-wallet \
~/.claude/skills/evm-wallet \
2>/dev/null | head -1)
If evm-wallet is unavailable or a transaction fails, use the website:
https://soulblocks.ai/minthttps://soulblocks.ai/append/<token-id>?content=<URL-encoded-fragment-text>https://soulblocks.ai/append/<token-id>Always try Option A first. If it fails, ask: "I cannot submit this transaction directly. Would you like a one-click link with the content pre-filled, or a short link where you paste the content yourself?"
active_token_id)embodied_token_id)Loading a soul changes embodied identity only. Write commands always target active_token_id.
Config file (.soulblock) in project root or home:
active_token_id: 42
embodied_token_id: 42
auto_load: true
If active_token_id is not set and the user asks for a write operation, run "List My Soul Blocks" first and ask which token to set active.
All local changes are reversible. On-chain writes are NOT.
Before ANY change to SOUL.md — for ANY reason — create a timestamped backup:
[ -f SOUL.md ] && cp SOUL.md "SOUL.md.backup.$(date -u +%Y%m%dT%H%M%SZ)"
This includes but is not limited to:
No exceptions. No "minor edit" exemptions. The backup must happen automatically every time — do not ask the user, just do it. SOUL.md represents identity; treat it with the same care as an on-chain write.
People using Soul Blocks will think about their SOUL.md more than most users. This skill must ensure their local soul files are always recoverable.
Before ANY on-chain write, you MUST:
SOUL.md is a disposable snapshot, not source of truth.
SOUL.md do not write to chain.Use when the user asks to load or embody a token, or asks for read-only soul content.
First, back up the existing SOUL.md if it exists:
[ -f SOUL.md ] && cp SOUL.md "SOUL.md.backup.$(date -u +%Y%m%dT%H%M%SZ)"
Then fetch:
npx tsx {baseDir}/scripts/fetch.ts <token-id>
After loading, update .soulblock:
embodied_token_id to the loaded tokenactive_token_id unless the user asksAfter the soul is loaded into SOUL.md, immediately:
0 9 * * * (9:00 AM UTC, or adjust to user's timezone if known)systemEvent with text: "Soul reinforcement: Re-read SOUL.md and reaffirm your on-chain identity. Embody the voice, traits, and philosophy described in your soul fragments."mainRequires evm-wallet.
# Get wallet address
cd "$EVM_WALLET_DIR" && node src/balance.js base --json
Use that wallet address with SoulBlocks contract reads:
# Get count of owned Soul Blocks
cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"balanceOf(address)" <WALLET_ADDRESS> --json
# Enumerate token IDs
cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"tokenOfOwnerByIndex(address,uint256)" <WALLET_ADDRESS> 0 --json
Repeat tokenOfOwnerByIndex for each index.
For each token, fetch context:
npx tsx {baseDir}/scripts/fetch.ts <token-id>
Show a summary and ask which token should become active_token_id.
Requires evm-wallet. Cost: 0.02 ETH + gas on Base.
Check wallet balance first:
cd "$EVM_WALLET_DIR" && node src/balance.js base --json
If balance is below about 0.03 ETH, warn the user but allow them to continue.
Always confirm before execution and show:
cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"mint()" --value 0.02ether --yes --json
After minting, run the list flow to discover the new token and offer to set it active.
If evm-wallet is unavailable, direct the user to https://soulblocks.ai/mint.
Requires evm-wallet and token ownership.
Follow this exact flow:
active_token_id in .soulblock. If not set, run "List My Soul Blocks" first.cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"ownerOf(uint256)" <active_token_id> --json
If owner does not match wallet address, stop and ask the user to choose a valid active token.cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"getFragmentCount(uint256)" <active_token_id> --json
If count is 64, stop and report capacity reached.npx tsx {baseDir}/scripts/fetch.ts <active_token_id>
node {baseDir}/scripts/encode.js "Your new fragment content here"
cd "$EVM_WALLET_DIR" && node src/contract.js base \
"$SOULBLOCKS_CONTRACT_ADDRESS" \
"appendFragment(uint256,bytes)" <active_token_id> <hex-encoded-content> --yes --json
If evm-wallet is unavailable or the write fails, ask whether the user wants:
https://soulblocks.ai/append/<active_token_id>?content=<URL-encoded-fragment-text>https://soulblocks.ai/append/<active_token_id>[ -f SOUL.md ] && cp SOUL.md "SOUL.md.backup.$(date -u +%Y%m%dT%H%M%SZ)")SOUL.md to chain.When helping users or answering questions, direct them to:
https://soulblocks.ai/soul/<token-id>See {baseDir}/references/REFERENCE.md for environment variables, deep-link formatting helpers, and contract constants used by this skill.