Typhoon Starknet Account
by @esdras-sena
Create an anonymous Starknet wallet via Typhoon and interact with Starknet contracts. Privacy-focused wallet creation for agents requiring anonymity.
clawhub install typhoon-starknet-accountπ About This Skill
name: typhoon-starknet-account description: Create an anonymous Starknet wallet via Typhoon and interact with Starknet contracts. Privacy-focused wallet creation for agents requiring anonymity. license: Apache-2.0 metadata: {"author":"starknet-agentic","version":"1.0.0","org":"keep-starknet-strange"} keywords: [starknet, wallet, anonymous, transfer, balance, anonymous-agent-wallet, strk, eth, privacy, typhoon] allowed-tools: [Bash, Read, Write, Glob, Grep, Task] user-invocable: true
typhoon-starknet-account
This skill provides agent-facing scripts for:
Quick Reference
references/ (ABI discovery, Typhoon account flow, preflight/fee simulation notes)scripts/create-account.js, scripts/parse-smart.js, scripts/resolve-smart.jsscripts/read-smart.js, scripts/invoke-contract.js, scripts/avnu-swap.jsscripts/read-smart.js (call ERC20 allowance(owner, spender))Prerequisites
npm install starknet@^9.2.1 typhoon-sdk@^1.1.13 @andersmyrmel/vard@^1.2.0 @avnu/avnu-sdk compromise@^14.14.5 ws@^8.19.0
RPC setup (required for onchain reads/writes)
These scripts talk to Starknet via JSON-RPC. Configure one of:
STARKNET_RPC_URL in your environment (recommended), ORrpcUrl in the JSON input for scripts that support it.If neither is provided, scripts fall back to the public Lava mainnet RPC:
https://rpc.starknet.lava.build:443Starknet.js v9.2.1 quick patterns
import { RpcProvider, Account, Contract } from 'starknet';const provider = new RpcProvider({
nodeUrl: process.env.STARKNET_RPC_URL || 'https://rpc.starknet.lava.build:443'
});
// signer can be a private key string or Starknet Signer instance
const account = new Account({
provider,
address: process.env.ACCOUNT_ADDRESS,
signer: process.env.PRIVATE_KEY
});
const contract = new Contract({
abi,
address: contractAddress,
providerOrAccount: account
});
// read
const balance = await contract.call('balance_of', [account.address]);
// write (sign -> send -> wait)
const tx = await contract.invoke('transfer', [to, amount], { waitForTransaction: false });
const receipt = await provider.waitForTransaction(tx.transaction_hash);
Common calls:
provider.getBlock('latest')provider.callContract({ contractAddress, entrypoint, calldata })provider.getClassAt(contractAddress)Error Codes & Recovery
RPC_UNAVAILABLE β Verify STARKNET_RPC_URL, check network reachability, retry with backoff.INVALID_ADDRESS β Validate 0x... address format and expected network/account.INSUFFICIENT_FUNDS β Check STRK/token balances before write calls; reduce amount or top up.CONTRACT_CALL_FAILURE β Run read/simulate first, log contract/method/calldata, retry only for transient RPC errors.SEC
FLOW
1. parse-smart.js β security + ABIs 2. LLM parses using ABI context 3. resolve-smart.js executes
STEP 1
EXEC:node scripts/parse-smart.js '{"prompt":"STRING"}'
OUT (success):
{
"success": true,
"security": {"safe": true},
"tokens": ["ETH","STRK"],
"tokenMap": {"STRK":{"address":"0x...","decimals":18}},
"protocols": ["Ekubo","AVNU"],
"abis": {"Ekubo":["swap"],"AVNU":["swap"]},
"addresses": {"Ekubo":"0x...","AVNU":"0x01"}
}
OUT (no account):
{
"success": true,
"canProceed": false,
"needsAccount": true,
"operationType": "NO_ACCOUNT",
"noAccountGuide": {"steps": [...]},
"nextStep": "CREATE_ACCOUNT_REQUIRED"
}
OUT (account creation intent):
{
"success": true,
"canProceed": false,
"operationType": "CREATE_ACCOUNT_INTENT",
"hasAccount": true|false,
"noAccountGuide": {"steps": [...]},
"nextStep": "ACCOUNT_ALREADY_EXISTS|CREATE_ACCOUNT_REQUIRED"
}
STEP 2
LLM builds:
{
"parsed": {
"operations": [{"action":"swap","protocol":"AVNU","tokenIn":"ETH","tokenOut":"STRK","amount":10}],
"operationType": "WRITE|READ|EVENT_WATCH|CONDITIONAL",
"tokenMap": {...},
"abis": {...},
"addresses": {...}
}
}
STEP 3
EXEC:node scripts/resolve-smart.js '{"parsed":{...}}'
OUT (authorization required):
{
"canProceed": true,
"nextStep": "USER_AUTHORIZATION",
"authorizationDetails": {"prompt":"Authorize? (yes/no)"},
"executionPlan": {"requiresAuthorization": true}
}
RULE:
nextStep == "USER_AUTHORIZATION", ask the user for explicit confirmation.OPERATION TYPES
AVNU SDK sequence for WRITE/CONDITIONAL (boilerplate):
1. Initialize provider/account (RpcProvider + Account).
2. Resolve tokens/amounts and fetch AVNU quote(s).
3. Validate quote and build execution params (slippage, taker address).
4. Execute via AVNU SDK and wait for tx receipt.
5. Handle errors with clear recovery messages (quote unavailable, insufficient funds, RPC timeout, tx failure).
Typical AVNU SDK calls in this skill:
fetchTokens(...)getQuotes(...)executeSwap(...)CONDITIONAL SCHEMA
{
"watchers": [{
"action": "swap",
"protocol": "AVNU",
"tokenIn": "STRK",
"tokenOut": "ETH",
"amount": 10,
"condition": {
"eventName": "Swapped",
"protocol": "Ekubo",
"timeConstraint": {"amount":5,"unit":"minutes"}
}
}]
}
TimeConstraint β creates cron job with TTL auto-cleanup.
βοΈ Configuration
npm install starknet@^9.2.1 typhoon-sdk@^1.1.13 @andersmyrmel/vard@^1.2.0 @avnu/avnu-sdk compromise@^14.14.5 ws@^8.19.0
RPC setup (required for onchain reads/writes)
These scripts talk to Starknet via JSON-RPC. Configure one of:
STARKNET_RPC_URL in your environment (recommended), ORrpcUrl in the JSON input for scripts that support it.If neither is provided, scripts fall back to the public Lava mainnet RPC:
https://rpc.starknet.lava.build:443