Manage LUKSO Universal Profiles — identity, permissions, tokens, blockchain operations. Cross-chain support for Base and Ethereum.
数据来源:ClawHub。 在 ClawSkills 查看
选择你使用的 Agent
方法一:命令行安装(推荐)
推荐(无需提前安装 clawhub)
npx clawhub@latest --dir ~/.claude/skills install universal-profile或使用 clawhub CLI(需提前安装)
clawhub --dir ~/.claude/skills install universal-profile⚠️ 需要 Node.js 18+,没有 Node?请使用下方方法二直接下载 ZIP。 安装 Node.js →
方法二:手动下载安装(无需 Node)
下载 ZIP,解压后将文件夹放到以下路径,重启 Agent 即可:
安装路径
~/.claude/skills/universal-profile/💡解压后将文件夹放到上方路径,重启 Agent 即可生效
--- name: universal-profile description: Manage LUKSO Universal Profiles — identity, permissions, tokens, blockchain operations. Cross-chain support for Base and Ethereum. version: 0.9.0 author: frozeman ---
Authorize your bot: create a profile at my.universalprofile.cloud, generate a controller key, authorize via Authorization UI.
execute() so msg.sender = UP address.setData()/setDataBatch() can be called directly on UP (checks permissions internally).Controller → UP.execute(operation, target, value, data) → Target
The controller calls execute() directly on the UP contract. The UP internally verifies permissions via its KeyManager (LSP20 lsp20VerifyCall). Do NOT call the KeyManager's execute() function directly. Always call the UP.
Controller signs LSP25 → Relay API submits → KeyManager.executeRelayCall() → UP
The controller signs a message, then the LUKSO relay service submits the transaction. Do NOT call executeRelayCall() yourself — the relay API does this.
⚠️ CRITICAL: The relay/gasless option exists ONLY on LUKSO mainnet (42) and testnet (4201). On Base, Ethereum, and all other chains, the controller must hold native ETH and pay gas directly. There is no gasless alternative.
Typical gas costs: LUKSO ~free via relay, Base ~$0.001-0.01/tx, Ethereum ~$0.10-1.00/tx.
| Chain | ID | RPC | Explorer | Relay | Token | |---|---|---|---|---|---| | LUKSO | 42 | https://42.rpc.thirdweb.com | https://explorer.lukso.network | https://relayer.mainnet.lukso.network/api | LYX | | LUKSO Testnet | 4201 | https://rpc.testnet.lukso.network | https://explorer.testnet.lukso.network | https://relayer.testnet.lukso.network/api | LYXt | | Base | 8453 | https://mainnet.base.org | https://basescan.org | ❌ | ETH | | Ethereum | 1 | https://eth.llamarpc.com | https://etherscan.io | ❌ | ETH |
up status # Config, keys, connectivity
up profile info [<address>] [--chain <chain>] # Profile details
up profile configure <address> [--chain lukso] # Save UP for use
up key generate [--save] [--password <pw>] # Generate controller keypair
up permissions encode <perm1> [<perm2> ...] # Encode to bytes32
up permissions decode <hex> # Decode to names
up permissions presets # List presets
up authorize url [--permissions <preset|hex>] # Generate auth URL
up quota # Check relay gas quota (LUKSO only)
Presets: read-only 🟢 | token-operator 🟡 | nft-trader 🟡 | defi-trader 🟠 | profile-manager 🟡 | full-access 🔴
Config lookup order: UP_CREDENTIALS_PATH env → ~/.openclaw/universal-profile/config.json → ~/.clawdbot/universal-profile/config.json
Key lookup order: UP_KEY_PATH env → ~/.openclaw/credentials/universal-profile-key.json → ~/.clawdbot/credentials/universal-profile-key.json
Canonical path for new credentials: ~/.openclaw/credentials/universal-profile-key.json
Skill config path: ~/.openclaw/skills/universal-profile/config.json
Expected JSON format:
{
"universalProfile": {
"address": "0xYourUniversalProfileAddress"
},
"controller": {
"address": "0xYourControllerAddress",
"privateKey": "0xYourPrivateKey"
}
}
Key file permissions: chmod 600. Keys loaded only for signing, then cleared. The skill warns if credential files are readable by group/others.
| Permission | Hex | Risk | Notes | |---|---|---|---| | CHANGEOWNER | 0x01 | 🔴 | | | ADDCONTROLLER | 0x02 | 🟠 | | | EDITPERMISSIONS | 0x04 | 🟠 | | | ADDEXTENSIONS | 0x08 | 🟡 | | | CHANGEEXTENSIONS | 0x10 | 🟡 | | | ADDUNIVERSALRECEIVERDELEGATE | 0x20 | 🟡 | | | CHANGEUNIVERSALRECEIVERDELEGATE | 0x40 | 🟡 | | | REENTRANCY | 0x80 | 🟡 | | | SUPER_TRANSFERVALUE | 0x0100 | 🟠 | Any recipient | | TRANSFERVALUE | 0x0200 | 🟡 | AllowedCalls only | | SUPER_CALL | 0x0400 | 🟠 | Any contract | | CALL | 0x0800 | 🟡 | AllowedCalls only | | SUPER_STATICCALL | 0x1000 | 🟢 | | | STATICCALL | 0x2000 | 🟢 | | | SUPER_DELEGATECALL | 0x4000 | 🔴 | | | DELEGATECALL | 0x8000 | 🔴 | | | DEPLOY | 0x010000 | 🟡 | | | SUPER_SETDATA | 0x020000 | 🟠 | Any key | | SETDATA | 0x040000 | 🟡 | AllowedERC725YDataKeys only | | ENCRYPT | 0x080000 | 🟢 | | | DECRYPT | 0x100000 | 🟢 | | | SIGN | 0x200000 | 🟢 | | | EXECUTE_RELAY_CALL | 0x400000 | 🟢 | |
SUPER variants = unrestricted. Regular = restricted to AllowedCalls/AllowedERC725YDataKeys. Prefer restricted.
// Controller calls UP.execute() directly — works on LUKSO, Base, Ethereum
const provider = new ethers.JsonRpcProvider(rpcUrl); // use correct RPC for chain
const wallet = new ethers.Wallet(controllerPrivateKey, provider);
const up = new ethers.Contract(upAddress, ['function execute(uint256,address,uint256,bytes) payable returns (bytes)'], wallet);
await (await up.execute(0, recipient, ethers.parseEther('0.01'), '0x')).wait();
LSP25 Relay Signature — EIP-191 v0, do NOT use signMessage():
const encoded = ethers.solidityPacked(
['uint256','uint256','uint256','uint256','uint256','bytes'],
[25, chainId, nonce, validityTimestamps, msgValue, payload]
);
const prefix = new Uint8Array([0x19, 0x00]);
const msg = new Uint8Array([...prefix, ...ethers.getBytes(kmAddress), ...ethers.getBytes(encoded)]);
const signature = ethers.Signature.from(new ethers.SigningKey(privateKey).sign(ethers.keccak256(msg))).serialized;
Relay API:
POST https://relayer.mainnet.lukso.network/api/execute
{ "address": "0xUP", "transaction": { "abi": "0xpayload", "signature": "0x...", "nonce": 0, "validityTimestamps": "0x0" } }
The payload for relay calls is the full UP.execute(...) calldata. The relay service calls KeyManager.executeRelayCall() — you never call the KM directly.
For setData via relay, the payload is the setData(...) calldata (NOT wrapped in execute()).
Nonce channels: getNonce(controller, channelId) — same channel = sequential, different = parallel. Validity timestamps: (startTimestamp << 128) | endTimestamp. Use 0 for no restriction.
UPs can be redeployed at the same address on other chains by replaying the original LSP23 factory calldata.
| Contract | Address | |---|---| | LSP23 Factory | 0x2300000A84D25dF63081feAa37ba6b62C4c89a30 | | UniversalProfileInit v0.14.0 | 0x3024D38EA2434BA6635003Dc1BDC0daB5882ED4F | | LSP6KeyManagerInit v0.14.0 | 0x2Fe3AeD98684E7351aD2D408A43cE09a738BF8a4 | | PostDeploymentModule | 0x000000000066093407b6704B89793beFfD0D8F00 |
node commands/cross-chain-deploy-data.js [--verify] wallet.sendTransaction({ to: factoryAddress, data: calldata, value: 0n })...
安装 Universal Profile 后,可以对 AI 说这些话来触发它
Help me get started with Universal Profile
Explains what Universal Profile does, walks through the setup, and runs a quick demo based on your current project
Use Universal Profile to manage LUKSO Universal Profiles — identity, permissions, tokens, bl...
Invokes Universal Profile with the right parameters and returns the result directly in the conversation
What can I do with Universal Profile in my finance & investment workflow?
Lists the top use cases for Universal Profile, with example commands for each scenario
将技能文件夹放到 ~/.claude/skills/universal-profile/ 目录(个人级,所有项目可用),或 .claude/skills/universal-profile/(项目级)。重启 AI 客户端后,用 /universal-profile 主动调用,或让 AI 根据上下文自动发现并使用。
Universal Profile 支持 Claude、Cursor、OpenClaw,可与这些 AI 平台无缝集成,扩展其能力。
Universal Profile 可免费安装使用。请查阅仓库了解许可证信息。
Manage LUKSO Universal Profiles — identity, permissions, tokens, blockchain operations. Cross-chain support for Base and Ethereum.
Universal Profile 属于「Finance & Investment」分类,该分类的技能帮助 AI 智能体在此领域执行专业任务。
Automate my finance & investment tasks using Universal Profile
Identifies repetitive steps in your workflow and sets up Universal Profile to handle them automatically