check-crypto-address-balance — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited check-crypto-address-balance (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Query cryptocurrency address balances across multiple blockchains using free public APIs. Supports Bitcoin, Ethereum, BSC, Solana, Litecoin, and other major chains without requiring API keys for basic queries.
| Chain | API | Base URL | Rate limit | Notes |
|---|---|---|---|---|
| Bitcoin (BTC) | Blockchain.info | https://blockchain.info | ~1 req/10s | Most reliable, no key needed |
| Bitcoin (BTC) | Blockstream | https://blockstream.info/api | Generous | Esplora API, open-source |
| Ethereum (ETH) | Etherscan | https://api.etherscan.io/api | 5 req/sec (free) | Optional key for higher limits |
| Ethereum (ETH) | Blockchair | https://api.blockchair.com | 30 req/min | Multi-chain support |
| BSC (BNB) | BscScan | https://api.bscscan.com/api | 5 req/sec (free) | Same API as Etherscan |
| Solana (SOL) | Public RPC | https://api.mainnet-beta.solana.com | Varies by node | Free public nodes |
| Solana (SOL) | Solscan API | https://public-api.solscan.io | 10 req/sec | No key for basic queries |
| Litecoin (LTC) | BlockCypher | https://api.blockcypher.com/v1/ltc/main | 200 req/hr | Multi-chain API |
| Litecoin (LTC) | Chain.so | https://chain.so/api/v2 | Generous | Simple JSON responses |
| Multi-chain | Blockchair | https://api.blockchair.com | 30 req/min | BTC, ETH, LTC, DOGE, BCH |
# Using Blockchain.info (satoshis, convert to BTC by dividing by 100000000)
curl -s "https://blockchain.info/q/addressbalance/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
# Using Blockstream (satoshis)
curl -s "https://blockstream.info/api/address/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" | jq '.chain_stats.funded_txo_sum - .chain_stats.spent_txo_sum'Node.js:
async function getBTCBalance(address) {
const res = await fetch(`https://blockchain.info/q/addressbalance/${address}`);
const satoshis = await res.text();
return parseFloat(satoshis) / 1e8; // convert satoshis to BTC
}# Using Etherscan (no API key required for single queries, returns wei)
curl -s "https://api.etherscan.io/api?module=account&action=balance&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae&tag=latest" | jq -r '.result'
# Using Blockchair (returns balance in wei with additional metadata)
curl -s "https://api.blockchair.com/ethereum/dashboards/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" | jq '.data[].address.balance'Node.js:
async function getETHBalance(address) {
const url = `https://api.etherscan.io/api?module=account&action=balance&address=${address}&tag=latest`;
const res = await fetch(url);
const data = await res.json();
return parseFloat(data.result) / 1e18; // convert wei to ETH
}# Using BscScan (same API as Etherscan)
curl -s "https://api.bscscan.com/api?module=account&action=balance&address=0x8894E0a0c962CB723c1976a4421c95949bE2D4E3&tag=latest" | jq -r '.result'Node.js:
async function getBSCBalance(address) {
const url = `https://api.bscscan.com/api?module=account&action=balance&address=${address}&tag=latest`;
const res = await fetch(url);
const data = await res.json();
return parseFloat(data.result) / 1e18; // convert wei to BNB
}# Using public RPC (balance in lamports, 1 SOL = 1e9 lamports)
curl -s https://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": ["vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"]
}' | jq '.result.value'
# Using Solscan API (returns SOL directly)
curl -s "https://public-api.solscan.io/account/vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg" | jq '.lamports'Node.js:
async function getSOLBalance(address) {
const res = await fetch('https://api.mainnet-beta.solana.com', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getBalance',
params: [address]
})
});
const data = await res.json();
return data.result.value / 1e9; // convert lamports to SOL
}# Using Chain.so (returns LTC directly)
curl -s "https://chain.so/api/v2/get_address_balance/LTC/LTC_ADDRESS/6" | jq -r '.data.confirmed_balance'
# Using BlockCypher (returns satoshis)
curl -s "https://api.blockcypher.com/v1/ltc/main/addrs/LTC_ADDRESS/balance" | jq '.balance'Node.js:
async function getLTCBalance(address) {
const res = await fetch(`https://chain.so/api/v2/get_address_balance/LTC/${address}/6`);
const data = await res.json();
return parseFloat(data.data.confirmed_balance);
}const APIS = {
BTC: (addr) => `https://blockchain.info/q/addressbalance/${addr}`,
ETH: (addr) => `https://api.etherscan.io/api?module=account&action=balance&address=${addr}&tag=latest`,
BSC: (addr) => `https://api.bscscan.com/api?module=account&action=balance&address=${addr}&tag=latest`,
LTC: (addr) => `https://chain.so/api/v2/get_address_balance/LTC/${addr}/6`
};
const DIVISORS = { BTC: 1e8, ETH: 1e18, BSC: 1e18, LTC: 1 };
async function getBalance(chain, address) {
if (chain === 'SOL') {
const res = await fetch('https://api.mainnet-beta.solana.com', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0', id: 1, method: 'getBalance', params: [address]
})
});
const data = await res.json();
return data.result.value / 1e9;
}
const url = APIS[chain](address);
const res = await fetch(url);
if (chain === 'BTC') {
const satoshis = await res.text();
return parseFloat(satoshis) / DIVISORS[chain];
} else if (chain === 'LTC') {
const data = await res.json();
return parseFloat(data.data.confirmed_balance);
} else {
const data = await res.json();
return parseFloat(data.result) / DIVISORS[chain];
}
}
// usage: getBalance('ETH', '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae').then(console.log);You have a cryptocurrency balance-checking skill. When a user provides a crypto address, detect the chain (BTC/ETH/BSC/SOL/LTC) from the address format:
- BTC: starts with 1, 3, or bc1
- ETH: starts with 0x (42 chars)
- BSC: starts with 0x (42 chars, context-dependent)
- SOL: base58 string (32-44 chars, no 0x)
- LTC: starts with L or M
Use the appropriate free public API from the table above, respecting rate limits. Return the balance in the native currency (BTC, ETH, BNB, SOL, LTC) with proper decimal conversion.Blockchair supports: BTC, ETH, LTC, DOGE, BCH, Dash, Ripple, Groestlcoin, Stellar, Monero (view-key required), Cardano, and Zcash (t-addresses).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.