Bridge Tokens
circlefin/skills
Build browser or server token bridging across chains with Circle App Kit or standalone Bridge Kit.
Web3 development using MetaMask Smart Accounts Kit. An agent skill from LeoYeAI/openclaw-master-skills.
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kit --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/smart-accounts-kit .claude/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .claude/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kitType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kit --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/smart-accounts-kit .agents/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .agents/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kit --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/smart-accounts-kit .cursor/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .cursor/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LeoYeAI/openclaw-master-skills.git --path skills/smart-accounts-kit--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kit --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/smart-accounts-kit .gemini/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .gemini/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kitInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/smart-accounts-kit .github/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .github/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills smart-accounts-kit --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/smart-accounts-kit .opencode/skills/smart-accounts-kit && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "smart-accounts-kit" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/smart-accounts-kit into .opencode/skills/smart-accounts-kit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "smart-accounts-kit", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
smart-accounts-kitWeb3 development using MetaMask Smart Accounts Kit. An agent skill from LeoYeAI/openclaw-master-skills.
Smart Accounts Kit is an agent skill from LeoYeAI/openclaw-master-skills. Web3 development using MetaMask Smart Accounts Kit. Use when the user wants to build dApps with ERC-4337 smart accounts, send user operations, batch transactions, configure signers (EOA, passkey, multisig), implement gas abstraction with paymasters, create delegations, or request advanced permissions (ERC-7715). Supports Viem integration, multiple signer types (Dynamic, Web3Auth, Wagmi), gasless transactions, and the Delegation Framework.
Its SKILL.md is about 6.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `_meta.json`, `references/advanced-permissions.md` and `references/delegations.md`).
It sits in Backend & APIs, covering Smart contracts. It works with viem and wagmi. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
calldata.swiss-knife.xyzmetamask.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
SESSION_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Smart Accounts Kit loads about 6.5k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 115 tokens; SKILL.md has 1,476 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 1,476 words, ~6,537 tokens.
.claude/skills/smart-accounts-kit/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.This skill file provides quick access to the MetaMask Smart Accounts Kit v0.3.0. For detailed information, refer to the specific reference files.
📚 Detailed References:
npm install @metamask/smart-accounts-kit@0.3.0For custom caveat enforcers:
forge install metamask/delegation-framework@v1.3.0Three implementation types:
| Implementation | Best For | Key Feature |
|---|---|---|
Hybrid (Implementation.Hybrid) | Standard dApp users | EOA + passkey signers, most flexible |
MultiSig (Implementation.MultiSig) | Treasury/DAO operations | Threshold-based security, Safe-compatible |
Stateless7702 (Implementation.Stateless7702) | Power users with existing EOA | Keep same address, add smart account features via EIP-7702 |
Decision Guide:
Grant permissions from delegator to delegate:
Request permissions via MetaMask extension:
import { Implementation, toMetaMaskSmartAccount } from '@metamask/smart-accounts-kit'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount('0x...')
const smartAccount = await toMetaMaskSmartAccount({
client: publicClient,
implementation: Implementation.Hybrid,
deployParams: [account.address, [], [], []],
deploySalt: '0x',
signer: { account },
})import { createDelegation } from '@metamask/smart-accounts-kit'
import { parseUnits } from 'viem'
const delegation = createDelegation({
to: delegateAddress,
from: delegatorSmartAccount.address,
environment: delegatorSmartAccount.environment,
scope: {
type: 'erc20TransferAmount',
tokenAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',
maxAmount: parseUnits('10', 6),
},
caveats: [
{ type: 'timestamp', afterThreshold: now, beforeThreshold: expiry },
{ type: 'limitedCalls', limit: 5 },
],
})const signature = await smartAccount.signDelegation({ delegation })
const signedDelegation = { ...delegation, signature }import { createExecution, ExecutionMode } from '@metamask/smart-accounts-kit'
import { DelegationManager } from '@metamask/smart-accounts-kit/contracts'
import { encodeFunctionData, erc20Abi } from 'viem'
const callData = encodeFunctionData({
abi: erc20Abi,
args: [recipient, parseUnits('1', 6)],
functionName: 'transfer',
})
const execution = createExecution({ target: tokenAddress, callData })
const redeemCalldata = DelegationManager.encode.redeemDelegations({
delegations: [[signedDelegation]],
modes: [ExecutionMode.SingleDefault],
executions: [[execution]],
})
// Via smart account
const userOpHash = await bundlerClient.sendUserOperation({
account: delegateSmartAccount,
calls: [{ to: delegateSmartAccount.address, data: redeemCalldata }],
})
// Via EOA
const txHash = await delegateWalletClient.sendTransaction({
to: environment.DelegationManager,
data: redeemCalldata,
})import { erc7715ProviderActions } from '@metamask/smart-accounts-kit/actions'
const walletClient = createWalletClient({
transport: custom(window.ethereum),
}).extend(erc7715ProviderActions())
const grantedPermissions = await walletClient.requestExecutionPermissions([
{
chainId: chain.id,
expiry: now + 604800,
signer: {
type: 'account',
data: { address: sessionAccount.address },
},
permission: {
type: 'erc20-token-periodic',
data: {
tokenAddress,
periodAmount: parseUnits('10', 6),
periodDuration: 86400,
justification: 'Transfer 10 USDC daily',
},
},
isAdjustmentAllowed: true,
},
])// Smart account
import { erc7710BundlerActions } from '@metamask/smart-accounts-kit/actions'
const bundlerClient = createBundlerClient({
client: publicClient,
transport: http(bundlerUrl),
}).extend(erc7710BundlerActions())
const permissionsContext = grantedPermissions[0].context
const delegationManager = grantedPermissions[0].signerMeta.delegationManager
const userOpHash = await bundlerClient.sendUserOperationWithDelegation({
publicClient,
account: sessionAccount,
calls: [
{
to: tokenAddress,
data: calldata,
permissionsContext,
delegationManager,
},
],
})
// EOA
import { erc7710WalletActions } from '@metamask/smart-accounts-kit/actions'
const walletClient = createWalletClient({
account: sessionAccount,
chain,
transport: http(),
}).extend(erc7710WalletActions())
const txHash = await walletClient.sendTransactionWithDelegation({
to: tokenAddress,
data: calldata,
permissionsContext,
delegationManager,
})toMetaMaskSmartAccount() - Create smart accountaggregateSignature() - Combine multisig signaturessignDelegation() - Sign delegationsignUserOperation() - Sign user operationsignMessage() / signTypedData() - Standard signingcreateDelegation() - Create delegation with delegatecreateOpenDelegation() - Create open delegationcreateCaveatBuilder() - Build caveats arraycreateExecution() - Create execution structredeemDelegations() - Encode redemption calldatasignDelegation() - Sign with private keygetSmartAccountsEnvironment() - Resolve environmentdeploySmartAccountsEnvironment() - Deploy contractsoverrideDeployedEnvironment() - Override environmenterc7715ProviderActions() - Wallet client extension for requestingrequestExecutionPermissions() - Request permissionserc7710BundlerActions() - Bundler client extensionsendUserOperationWithDelegation() - Redeem with smart accounterc7710WalletActions() - Wallet client extensionsendTransactionWithDelegation() - Redeem with EOA| Permission Type | Description |
|---|---|
erc20-token-periodic | Per-period limit that resets at each period |
erc20-token-stream | Linear streaming with amountPerSecond rate |
| Permission Type | Description |
|---|---|
native-token-periodic | Per-period ETH limit that resets |
native-token-stream | Linear ETH streaming with amountPerSecond rate |
| Scope | Description |
|---|---|
erc20TransferAmount | Fixed ERC-20 limit |
erc20PeriodTransfer | Per-period ERC-20 limit |
erc20Streaming | Linear streaming ERC-20 |
nativeTokenTransferAmount | Fixed native token limit |
nativeTokenPeriodTransfer | Per-period native token limit |
nativeTokenStreaming | Linear streaming native |
erc721Transfer | ERC-721 (NFT) transfer |
| Scope | Description |
|---|---|
functionCall | Specific methods/addresses allowed |
ownershipTransfer | Ownership transfers only |
allowedTargets - Limit callable addressesallowedMethods - Limit callable methodsallowedCalldata - Validate specific calldataexactCalldata / exactCalldataBatch - Exact calldata matchexactExecution / exactExecutionBatch - Exact execution matchvalueLte - Limit native token valueerc20TransferAmount - Limit ERC-20 amounterc20BalanceChange - Validate ERC-20 balance changeerc721Transfer / erc721BalanceChange - ERC-721 restrictionserc1155BalanceChange - ERC-1155 validationtimestamp - Valid time range (seconds)blockNumber - Valid block rangelimitedCalls - Limit redemption counterc20PeriodTransfer / erc20Streaming - Time-based ERC-20nativeTokenPeriodTransfer / nativeTokenStreaming - Time-based nativeredeemer - Limit redemption to specific addressesid - One-time delegation with IDnonce - Bulk revocation via noncedeployed - Auto-deploy contractownershipTransfer - Ownership transfer onlynativeTokenPayment - Require paymentnativeBalanceChange - Validate native balancemultiTokenPeriod - Multi-token period limits| Mode | Chains | Processing | On Failure |
|---|---|---|---|
SingleDefault | One | Sequential | Revert |
SingleTry | One | Sequential | Continue |
BatchDefault | Multiple | Interleaved | Revert |
BatchTry | Multiple | Interleaved | Continue |
| Contract | Address |
|---|---|
| EntryPoint | 0x0000000071727De22E5E9d8BAf0edAc6f37da032 |
| SimpleFactory | 0x69Aa2f9fe1572F1B640E1bbc512f5c3a734fc77c |
| DelegationManager | 0xdb9B1e94B5b69Df7e401DDbedE43491141047dB3 |
| MultiSigDeleGatorImpl | 0x56a9EdB16a0105eb5a4C54f4C062e2868844f3A7 |
| HybridDeleGatorImpl | 0x48dBe696A4D990079e039489bA2053B36E8FFEC4 |
valueLte)Smart accounts use a 256-bit nonce structure: 192-bit key + 64-bit sequence. Each unique key has its own independent sequence, enabling parallel execution. This is critical for backend services processing multiple delegations concurrently.
For proper nonce handling, install the permissionless SDK alongside the Smart Accounts Kit:
npm install permissionlessERC-4337 uses a single uint256 nonce where:
Each key has an independent sequence, so UserOps with different keys execute in parallel without ordering constraints.
import { getAccountNonce } from 'permissionless'
import { entryPoint07Address } from 'viem/account-abstraction'
// Get nonce for a specific key
const parallelNonce = await getAccountNonce(publicClient, {
address: smartAccount.address,
entryPointAddress: entryPoint07Address,
key: BigInt(Date.now()), // Unique key for parallel execution
})
const userOpHash = await bundlerClient.sendUserOperation({
account: smartAccount,
calls: [redeemCalldata],
nonce: parallelNonce, // Properly encoded 256-bit nonce
})import { getAccountNonce } from 'permissionless'
import { entryPoint07Address } from 'viem/account-abstraction'
// Execute multiple redemption UserOps in parallel
const redeems = await Promise.all(
delegations.map(async (delegation, index) => {
// Generate unique key for this operation
const nonceKey = BigInt(Date.now()) + BigInt(index * 1000)
// Get properly encoded nonce for this key
const nonce = await getAccountNonce(publicClient, {
address: backendSmartAccount.address,
entryPointAddress: entryPoint07Address,
key: nonceKey,
})
const redeemCalldata = DelegationManager.encode.redeemDelegations({
delegations: [[delegation]],
modes: [ExecutionMode.SingleDefault],
executions: [[execution]],
})
return bundlerClient.sendUserOperation({
account: backendSmartAccount,
calls: [{ to: backendSmartAccount.address, data: redeemCalldata }],
nonce, // Parallel execution enabled via unique key
})
})
)The EntryPoint contract encodes nonce as: sequence | (key << 64)
If not using permissionless, encode manually:
// EntryPoint: nonceSequenceNumber[sender][key] | (uint256(key) << 64)
const key = BigInt(Date.now())
const sequence = 0n // New key starts at sequence 0
const nonce = sequence | (key << 64n)
// Or equivalently: (key << 64n) | sequenceHowever, getAccountNonce from permissionless is recommended as it:
getAccountNonce returns the full 256-bit nonce properly encoded| Mistake | Result |
|---|---|
| Reusing same nonce key | Sequential execution (defeats purpose) |
Using Date.now() without offset | Potential collision if multiple ops fire simultaneously |
Not using getAccountNonce | May miss current sequence, causing replacement instead of new op |
| Assuming ordering | Race conditions in dependent operations |
const results = await Promise.allSettled(redeems)
results.forEach((result, index) => {
if (result.status === 'rejected') {
// Check for specific errors
if (result.reason.message?.includes('AA25')) {
console.error(`Nonce collision for op ${index}`)
}
// Handle or retry
}
})For server-side automation (DCA bots, keeper services, automated trading):
// 1. Backend creates its own smart account as delegate
const backendAccount = await toMetaMaskSmartAccount({
client: publicClient,
implementation: Implementation.Hybrid,
deployParams: [backendOwner.address, [], [], []],
deploySalt: '0x',
signer: { account: backendOwner },
})
// 2. Backend redeems by sending UserOp FROM its account
const userOpHash = await bundlerClient.sendUserOperation({
account: backendAccount,
calls: [{
to: backendAccount.address,
data: DelegationManager.encode.redeemDelegations({
delegations: [[userDelegation]],
modes: [ExecutionMode.SingleDefault],
executions: [[swapExecution]],
})
}],
})Use case: Automated dollar-cost averaging (DCA) bots that redeem swap delegations based on market signals or scheduled intervals.
Delegator accounts must be deployed before delegations can be redeemed. The DelegationManager reverts with 0xb9f0f171 for counterfactual accounts.
Solution: Deploy automatically via first UserOp:
// Build redemption calldata
const redeemCalldata = DelegationManager.encode.redeemDelegations({
delegations: [[signedDelegation]],
modes: [ExecutionMode.SingleDefault],
executions: [[execution]],
})
// First redemption deploys the account automatically via initCode
const userOpHash = await bundlerClient.sendUserOperation({
account: smartAccount, // Will deploy if counterfactual
calls: [{
to: smartAccount.address,
data: redeemCalldata,
value: 0n,
}],
})For automated services, session accounts act as isolated signers that can only operate within granted delegations. The private key can be generated ephemerally, stored in environment variables, or managed via HSM/server wallets:
// Session account created from various sources
const sessionAccount = privateKeyToAccount(
process.env.SESSION_KEY || generatePrivateKey() || hsmWallet.key
)
// Request delegation from user to session account
const delegation = createDelegation({
to: sessionAccount.address,
from: userSmartAccount.address,
environment,
scope: { type: 'erc20TransferAmount', tokenAddress, maxAmount: parseUnits('100', 6) },
caveats: [
{ type: 'timestamp', afterThreshold: now, beforeThreshold: expiry },
{ type: 'limitedCalls', limit: 10 },
],
})
// Session account can only act within delegation constraintsconst delegation = createDelegation({
to: delegate,
from: delegator,
environment,
scope: {
type: 'erc20TransferAmount',
tokenAddress,
maxAmount: parseUnits('100', 6),
},
caveats: [
{ type: 'timestamp', afterThreshold: now, beforeThreshold: expiry },
{ type: 'limitedCalls', limit: 10 },
{ type: 'redeemer', redeemers: [delegate] },
],
})const delegation = createDelegation({
to: delegate,
from: delegator,
environment,
scope: {
type: 'functionCall',
targets: [contractAddress],
selectors: ['transfer(address,uint256)'],
valueLte: { maxValue: parseEther('0.1') },
},
caveats: [{ type: 'allowedMethods', selectors: ['transfer(address,uint256)'] }],
})const delegation = createDelegation({
to: delegate,
from: delegator,
environment,
scope: {
type: 'nativeTokenPeriodTransfer',
periodAmount: parseEther('0.01'),
periodDuration: 86400,
startDate: now,
},
})// Alice → Bob (100 USDC)
const aliceToBob = createDelegation({
to: bob,
from: alice,
environment,
scope: { type: 'erc20TransferAmount', tokenAddress, maxAmount: parseUnits('100', 6) },
})
// Bob → Carol (50 USDC, subset of authority)
const bobToCarol = createDelegation({
to: carol,
from: bob,
environment,
scope: { type: 'erc20TransferAmount', tokenAddress, maxAmount: parseUnits('50', 6) },
parentDelegation: aliceToBob,
caveats: [{ type: 'timestamp', afterThreshold: now, beforeThreshold: expiry }],
})| Issue | Solution |
|---|---|
| Account not deployed | Use bundlerClient.sendUserOperation() to deploy |
| Invalid signature | Verify chain ID, delegation manager, signer permissions |
| Caveat enforcer reverted | Check caveat parameters match execution, verify order |
| Redemption failed | Check delegator balance, calldata validity, target contracts |
| ERC-7715 not working | Upgrade to Flask 13.5.0+, ensure user has smart account |
| Permission denied | Handle gracefully, provide manual fallback |
| Threshold not met | Add more signers for multisig |
| 7702 not working | Confirm EOA upgraded via EIP-7702 first |
Error codes from the MetaMask Delegation Framework contracts (v1.3.0). Use a decoder like calldata.swiss-knife.xyz to identify error signatures.
| Error Code | Error Name | Meaning |
|---|---|---|
0xb5863604 | InvalidDelegate() | Caller is not the delegate — Most common error |
0xb9f0f171 | InvalidDelegator() | Caller is not the delegator |
0x05baa052 | CannotUseADisabledDelegation() | Attempting to redeem a disabled delegation |
0xded4370e | InvalidAuthority() | Delegation chain authority validation failed |
0x1bcaf69f | BatchDataLengthMismatch() | Array lengths don't match in batch |
0x005ecddb | AlreadyDisabled() | Delegation has already been disabled |
0xf2a5f75a | AlreadyEnabled() | Delegation is already enabled |
0xf645eedf | ECDSAInvalidSignature() | Invalid ECDSA signature format |
0xfce698f7 | ECDSAInvalidSignatureLength(uint256) | Signature length is incorrect |
0xd78bce0c | ECDSAInvalidSignatureS(bytes32) | Signature S value is invalid |
0xac241e11 | EmptySignature() | Signature is empty |
0xd93c0665 | EnforcedPause() | Contract is paused |
0x3db6791c | InvalidEOASignature() | EOA signature verification failed |
0x155ff427 | InvalidERC1271Signature() | Smart contract signature (ERC1271) failed |
0x118cdaa7 | OwnableUnauthorizedAccount(address) | Unauthorized account attempted owner-only action |
0x1e4fbdf7 | OwnableInvalidOwner(address) | Invalid owner address in ownership transfer |
0xf6b6ef5b | InvalidShortString() | String parameter too short |
0xaa0ea2d8 | StringTooLong(string) | String parameter exceeds maximum length |
| Error Code | Error Name | Meaning |
|---|---|---|
0xd663742a | NotEntryPoint() | Caller is not the EntryPoint contract |
0x0796d945 | NotEntryPointOrSelf() | Caller is neither EntryPoint nor this contract |
0x1a4b3a04 | NotDelegationManager() | Caller is not the DelegationManager |
0xb96fcfe4 | UnsupportedCallType(bytes1) | Execution call type not supported |
0x1187dc06 | UnsupportedExecType(bytes1) | Execution type not supported |
0x29c3b7ee | NotSelf() | Caller is not this contract itself |
| Error String | Meaning |
|---|---|
AllowedTargetsEnforcer:target-address-not-allowed | Target contract not in allowed list |
AllowedTargetsEnforcer:invalid-terms-length | Terms length not multiple of 20 bytes |
ERC20TransferAmountEnforcer:invalid-terms-length | Terms must be 52 bytes |
ERC20TransferAmountEnforcer:invalid-contract | Target doesn't match allowed token |
ERC20TransferAmountEnforcer:invalid-method | Method is not transfer |
ERC20TransferAmountEnforcer:allowance-exceeded | Transfer exceeds delegated limit |
CaveatEnforcer:invalid-call-type | Must use single call type |
CaveatEnforcer:invalid-execution-type | Must use default execution type |
0xb5863604 — InvalidDelegate()
msg.sender equals the to address in the delegation0xb9f0f171 — InvalidDelegator()
0x05baa052 — CannotUseADisabledDelegation()
0xded4370e — InvalidAuthority()
0x1bcaf69f — BatchDataLengthMismatch()
redeemDelegations callpermissionContexts, modes, executionCallDatas have equal length0x3db6791c — InvalidEOASignature()
@metamask/smart-accounts-kitmetamask/delegation-framework@v1.3.0For detailed documentation, see the reference files in the /references directory.
© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/smart-accounts-kit of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Smart Accounts Kit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Smart Accounts Kit this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~6.5k | Automated safety check: Pass | MIT | |
| Bridge Tokenscirclefin/skills | 155 | — | ~4.5k | Automated safety check: Notes | Apache-2.0 | |
| Use Arccirclefin/skills | 155 | — | ~2.1k | Automated safety check: Notes | Apache-2.0 | |
| Alchemy Hello Worldjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.2k | Automated safety check: Pass | MIT | |
| Alchemy Core Workflow Bjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.2k | Automated safety check: Pass | MIT | |
| Dapp Frontend Patternsccashwell/evm-cortex | 131 | — | ~1.9k | Automated safety check: Pass | MIT |
circlefin/skills
Build browser or server token bridging across chains with Circle App Kit or standalone Bridge Kit.
circlefin/skills
Provide instructions on how to build with Arc, Circle's blockchain where USDC is the native gas token.
jeremylongshore/tons-of-skills-marketplace
Build a minimal, reviewable Alchemy EVM read with viem and prove its network, authentication, and failure behavior.
jeremylongshore/tons-of-skills-marketplace
Build an NFT discovery workflow with Alchemy NFT API v3 and isolate typed on-chain reads through viem.
ccashwell/evm-cortex
A skill your agent uses when building dApp frontends with wagmi v2 and viem.
pashov/skills
Convert English-language properties in PROPERTIES.md (produced by the Fizz skill) into Solidity assertions inside the existing fuzz harness, then flip their checkboxes.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Works with
Categories
Web3 development using MetaMask Smart Accounts Kit. An agent skill from LeoYeAI/openclaw-master-skills. Smart Accounts Kit is an agent skill from LeoYeAI/openclaw-master-skills. Web3 development using MetaMask Smart Accounts Kit.
Smart Accounts Kit fits situations like: the user wants to build dApps with ERC-4337 smart accounts; send user operations; batch transactions; configure signers (EOA.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a claude-code`. Or copy the skill folder (skills/smart-accounts-kit in LeoYeAI/openclaw-master-skills) into .claude/skills/smart-accounts-kit in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a codex`. Or copy the skill folder (skills/smart-accounts-kit in LeoYeAI/openclaw-master-skills) into .agents/skills/smart-accounts-kit in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LeoYeAI/openclaw-master-skills --skill smart-accounts-kit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/smart-accounts-kit, .gemini/skills/smart-accounts-kit, .github/skills/smart-accounts-kit and .opencode/skills/smart-accounts-kit in your project.
Going by SKILL.md and its folder, Smart Accounts Kit needs the command-line tools its instructions call (npm) and credentials named SESSION_KEY. Our summary lists: Node.js.
SKILL.md names 2 domains. As links in the text: calldata.swiss-knife.xyz and metamask.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Smart Accounts Kit is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.5k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 14k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Smart Accounts Kit: Bridge Tokens (circlefin/skills, 155 stars), Use Arc (circlefin/skills, 155 stars), Alchemy Hello World (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Alchemy Core Workflow B (jeremylongshore/tons-of-skills-marketplace, 2.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,161 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.