
Endaoment
- 133 installs
- 1.2k repo stars
- Updated August 1, 2026
- bankrbot/openclaw-skills
Integrate Endaoment charitable giving so agents or apps can route crypto donations, track DAF flows, and receipt outcomes programmatically.
About
Teaches integration with Endaoment for programmatic crypto philanthropy: configuring donation intents, routing assets through donor-advised fund mechanics, tracking disbursement status, and embedding compliant giving flows in Bankr-style agents or web apps.
- Endaoment donation and DAF flows
- onchain gift routing patterns
- compliance-aware payout handling
- agent instructions for nonprofit disbursement
- receipt and status tracking hooks
Endaoment by the numbers
- 133 all-time installs (skills.sh)
- Ranked #147 of 479 Web3 & Blockchain skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/bankrbot/openclaw-skills --skill endaomentAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 133 |
|---|---|
| repo stars | ★ 1.2k |
| Last updated | August 1, 2026 |
| Repository | bankrbot/openclaw-skills ↗ |
What it does
Integrate Endaoment charitable giving so agents or apps can route crypto donations, track DAF flows, and receipt outcomes programmatically.
Files
Endaoment Charity Donations
Donate to 501(c)(3) nonprofits onchain via Endaoment's smart contracts.
Quick Start
Find a Charity
Search by name or EIN:
./scripts/search.sh "27-1661997" # EIN lookup (GiveDirectly)
./scripts/search.sh "Red Cross" # Name searchDonate USDC (Base)
./scripts/donate.sh <ein> <amount_usdc>Example: Donate $5 USDC to GiveDirectly:
./scripts/donate.sh 27-1661997 5How It Works
The donate script uses Bankr's arbitrary transaction feature to: 1. Approve USDC to the Endaoment OrgFundFactory 2. Call deployOrgAndDonate(orgId, amount) which:
- Deploys the charity's entity contract on Base (if not already deployed)
- Donates the specified USDC amount
Popular Charities
| Charity | EIN |
|---|---|
| GiveDirectly | 27-1661997 |
| North Shore Animal League America | 11-1666852 |
| American Red Cross | 53-0196605 |
| Doctors Without Borders | 13-3433452 |
| ASPCA | 13-1623829 |
See references/popular-charities.md for more.
Contract Addresses (Base)
| Contract | Address |
|---|---|
| Registry | 0x237b53bcfbd3a114b549dfec96a9856808f45c94 |
| OrgFundFactory | 0x10fd9348136dcea154f752fe0b6db45fc298a589 |
| USDC | 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 |
Fees
- Org donations: 1.5% fee (e.g., $100 → $1.50 fee, $98.50 to charity)
- Fund donations: 0.05-0.50% tiered
Requirements
- Bankr skill with API key configured
- USDC balance on Base
- ETH on Base for gas (Bankr covers this)
Technical Details
Function Selectors
approve(address,uint256):0x095ea7b3deployOrgAndDonate(bytes32,uint256):0xdb9e30cc
OrgId Encoding
The EIN (e.g., "11-1666852") is encoded as bytes32:
"11-1666852" → 0x31312d3136363638353200000000000000000000000000000000000000000000Notes
- All donations are tax-deductible (US 501(c)(3) orgs)
- Donations are permissionless — anyone can donate
- Uses Bankr arbitrary transactions for contract interaction
- Works on Base; other chains require different addresses
{
"schemaVersion": 1,
"slug": "endaoment",
"provider": "Endaoment",
"providerUrl": "https://endaoment.org",
"logo": null,
"demo": {
"title": "donate.sh",
"language": "bash",
"code": "# Search charities by EIN or name\n./scripts/search.sh \"27-1661997\" # GiveDirectly\n./scripts/search.sh \"Red Cross\"\n\n# Donate USDC to any 501(c)(3) on Base\n./scripts/donate.sh 27-1661997 5 # $5 to GiveDirectly\n./scripts/donate.sh 13-1623829 10 # $10 to ASPCA"
},
"setup": [
"Install: `npx skills add endaoment`",
"Requires Bankr skill with API key configured",
"Fund wallet with USDC on Base",
"Search charities by EIN or name, then donate"
],
"install": {
"type": "bankr",
"repoPath": "endaoment",
"command": "install the endaoment skill from https://github.com/BankrBot/skills/tree/main/endaoment"
}
}
Popular Charities on Endaoment
Quick reference for well-known 501(c)(3) organizations.
Effective Giving
| Charity | EIN | Focus |
|---|---|---|
| GiveDirectly | 27-1661997 | Direct cash transfers to poor |
| GiveWell | 20-8625442 | Charity evaluator |
| Against Malaria Foundation | 20-3069841 | Malaria prevention |
Humanitarian
| Charity | EIN | Focus |
|---|---|---|
| Doctors Without Borders | 13-3433452 | Medical aid |
| UNICEF USA | 13-1760110 | Children's welfare |
| International Rescue Committee | 13-5660870 | Refugees |
| Save the Children | 06-0726487 | Children's welfare |
| Direct Relief | 95-1831116 | Medical supplies |
Environment
| Charity | EIN | Focus |
|---|---|---|
| The Nature Conservancy | 53-0242652 | Land conservation |
| Environmental Defense Fund | 11-6107128 | Environmental advocacy |
| World Wildlife Fund | 52-1693387 | Wildlife conservation |
Education & Research
| Charity | EIN | Focus |
|---|---|---|
| Khan Academy | 26-1544963 | Free education |
| Wikipedia Foundation | 20-0049703 | Free knowledge |
Animal Welfare
| Charity | EIN | Focus |
|---|---|---|
| ASPCA | 13-1623829 | Animal welfare |
| Humane Society | 53-0225390 | Animal protection |
Usage
# Lookup by EIN
./scripts/search.sh "27-1661997"
# Donate $50 to GiveDirectly
./scripts/donate.sh 27-1661997 50 base#!/bin/bash
# Donate USDC to an Endaoment charity on Base via Bankr arbitrary transactions
# Usage: ./donate.sh <ein> <amount_usdc>
#
# Example: ./donate.sh 11-1666852 1 (donates 1 USDC to North Shore Animal League)
set -euo pipefail
# Require Bankr CLI
if ! command -v bankr >/dev/null 2>&1; then
echo "Bankr CLI not found. Install with: bun install -g @bankr/cli" >&2
exit 1
fi
EIN="${1:-}"
AMOUNT="${2:-}"
if [[ -z "$EIN" ]] || [[ -z "$AMOUNT" ]]; then
echo "Usage: $0 <ein> <amount_usdc>"
echo ""
echo "Examples:"
echo " $0 11-1666852 1 # North Shore Animal League America"
echo " $0 27-1661997 5 # GiveDirectly"
echo " $0 53-0196605 10 # American Red Cross"
exit 1
fi
# Base chain addresses
FACTORY="0x10fd9348136dcea154f752fe0b6db45fc298a589"
USDC="0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
CHAIN_ID=8453
RPC_URL="https://mainnet.base.org"
# Convert amount to USDC decimals (6)
AMOUNT_WEI=$(echo "$AMOUNT * 1000000" | bc | cut -d'.' -f1)
AMOUNT_HEX=$(printf '%064x' "$AMOUNT_WEI")
# Encode EIN as bytes32 (remove hyphens/spaces, digits only)
# IMPORTANT: Endaoment uses EIN WITHOUT hyphens (e.g., "111666852" not "11-1666852")
EIN_CLEAN=$(echo "$EIN" | tr -d ' -')
EIN_HEX=$(echo -n "$EIN_CLEAN" | xxd -p)
ORG_ID="${EIN_HEX}$(printf '%0*d' $((64 - ${#EIN_HEX})) 0)"
# Compute the deterministic contract address using computeOrgAddress(bytes32)
echo "🔍 Looking up charity contract address..."
COMPUTE_RESULT=$(curl -s -X POST "$RPC_URL" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"$FACTORY\",\"data\":\"0x9fb8578d${ORG_ID}\"},\"latest\"],\"id\":1}" | jq -r '.result')
if [[ -z "$COMPUTE_RESULT" ]] || [[ "$COMPUTE_RESULT" == "null" ]]; then
echo "❌ Failed to compute contract address for EIN: $EIN"
exit 1
fi
# Extract address from padded result
ENTITY_ADDRESS="0x$(echo "$COMPUTE_RESULT" | tail -c 41 | head -c 40)"
echo " Entity address: $ENTITY_ADDRESS"
# Check if contract is already deployed (eth_getCode)
CODE=$(curl -s -X POST "$RPC_URL" \
-H "Content-Type: application/json" \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$ENTITY_ADDRESS\",\"latest\"],\"id\":1}" | jq -r '.result')
# Function selectors
APPROVE_SELECTOR="095ea7b3" # approve(address,uint256)
DONATE_SELECTOR="f14faf6f" # donate(uint256)
DEPLOY_SELECTOR="db9e30cc" # deployOrgAndDonate(bytes32,uint256)
echo ""
echo "🎁 Endaoment Donation on Base"
echo " EIN: $EIN"
echo " Amount: $AMOUNT USDC"
echo ""
if [[ "$CODE" != "0x" ]] && [[ -n "$CODE" ]]; then
# Contract already deployed - donate directly
echo "✅ Contract already deployed, donating directly..."
# Transaction 1: Approve USDC to entity
APPROVE_DATA="0x${APPROVE_SELECTOR}000000000000000000000000${ENTITY_ADDRESS:2}${AMOUNT_HEX}"
echo "📝 Step 1: Approving USDC..."
APPROVE_TX="{\"to\": \"$USDC\", \"data\": \"$APPROVE_DATA\", \"value\": \"0\", \"chainId\": $CHAIN_ID}"
APPROVE_RESULT=$(bankr agent "Submit this transaction: $APPROVE_TX" 2>&1)
if echo "$APPROVE_RESULT" | grep -q "basescan.org/tx"; then
APPROVE_HASH=$(echo "$APPROVE_RESULT" | grep -o 'https://basescan.org/tx/[^ "]*' | head -1)
echo " ✅ Approved: $APPROVE_HASH"
else
echo " ❌ Approve failed: $APPROVE_RESULT"
exit 1
fi
# Transaction 2: Donate directly to entity
DONATE_DATA="0x${DONATE_SELECTOR}${AMOUNT_HEX}"
echo "📝 Step 2: Donating..."
DONATE_TX="{\"to\": \"$ENTITY_ADDRESS\", \"data\": \"$DONATE_DATA\", \"value\": \"0\", \"chainId\": $CHAIN_ID}"
DONATE_RESULT=$(bankr agent "Submit this transaction: $DONATE_TX" 2>&1)
if echo "$DONATE_RESULT" | grep -q "basescan.org/tx"; then
DONATE_HASH=$(echo "$DONATE_RESULT" | grep -o 'https://basescan.org/tx/[^ "]*' | head -1)
echo " ✅ Donated: $DONATE_HASH"
else
echo " ❌ Donation failed: $DONATE_RESULT"
exit 1
fi
else
# Contract not deployed - use factory to deploy and donate
echo "📦 Contract not deployed on Base, deploying via factory..."
# Transaction 1: Approve USDC to factory
APPROVE_DATA="0x${APPROVE_SELECTOR}000000000000000000000000${FACTORY:2}${AMOUNT_HEX}"
echo "📝 Step 1: Approving USDC to factory..."
APPROVE_TX="{\"to\": \"$USDC\", \"data\": \"$APPROVE_DATA\", \"value\": \"0\", \"chainId\": $CHAIN_ID}"
APPROVE_RESULT=$(bankr agent "Submit this transaction: $APPROVE_TX" 2>&1)
if echo "$APPROVE_RESULT" | grep -q "basescan.org/tx"; then
APPROVE_HASH=$(echo "$APPROVE_RESULT" | grep -o 'https://basescan.org/tx/[^ "]*' | head -1)
echo " ✅ Approved: $APPROVE_HASH"
else
echo " ❌ Approve failed: $APPROVE_RESULT"
exit 1
fi
# Transaction 2: Deploy & Donate via factory
DEPLOY_DATA="0x${DEPLOY_SELECTOR}${ORG_ID}${AMOUNT_HEX}"
echo "📝 Step 2: Deploying & donating..."
DEPLOY_TX="{\"to\": \"$FACTORY\", \"data\": \"$DEPLOY_DATA\", \"value\": \"0\", \"chainId\": $CHAIN_ID}"
DEPLOY_RESULT=$(bankr agent "Submit this transaction: $DEPLOY_TX" 2>&1)
if echo "$DEPLOY_RESULT" | grep -q "basescan.org/tx"; then
DEPLOY_HASH=$(echo "$DEPLOY_RESULT" | grep -o 'https://basescan.org/tx/[^ "]*' | head -1)
echo " ✅ Deployed & Donated: $DEPLOY_HASH"
else
echo " ❌ Deploy & Donate failed: $DEPLOY_RESULT"
exit 1
fi
fi
echo ""
echo "🎉 Success! Donated $AMOUNT USDC to charity (EIN: $EIN)"
echo " Net to charity: ~\$$(echo "$AMOUNT * 0.985" | bc) (after 1.5% Endaoment fee)"
#!/bin/bash
# Search for Endaoment entities (charities) by name or EIN
# Usage: ./search.sh "charity name" or ./search.sh "12-3456789"
set -euo pipefail
QUERY="${1:-}"
CHAIN="${2:-base}"
if [[ -z "$QUERY" ]]; then
echo "Usage: $0 <charity_name_or_ein> [chain]"
echo ""
echo "Examples:"
echo " $0 \"27-1661997\" # EIN lookup (GiveDirectly)"
echo " $0 \"Red Cross\" base # Name search"
exit 1
fi
# Get chain index for deployments array
case "$CHAIN" in
ethereum|mainnet) CHAIN_IDX=0 ;;
optimism) CHAIN_IDX=1 ;;
base) CHAIN_IDX=2 ;;
*) CHAIN_IDX=2 ;;
esac
# Check if query looks like an EIN (XX-XXXXXXX or XXXXXXXXX)
CLEAN_EIN=$(echo "$QUERY" | tr -d '-')
if [[ "$CLEAN_EIN" =~ ^[0-9]{9}$ ]]; then
echo "🔍 Looking up EIN: $QUERY"
echo "---"
RESPONSE=$(curl -s "https://api.endaoment.org/v1/orgs/ein/${CLEAN_EIN}" \
-H "Accept: application/json")
if [[ -z "$RESPONSE" ]] || [[ "$RESPONSE" == *"error"* ]] || [[ "$RESPONSE" == *"Not Found"* ]]; then
echo "❌ No charity found with EIN: $QUERY"
exit 1
fi
echo "$RESPONSE" | jq -r --argjson idx "$CHAIN_IDX" '
"📛 Name: \(.name)
🆔 EIN: \(.ein)
📍 Contract: \(.deployments[$idx].contractAddress // "N/A")
✅ Deployed: \(.deployments[$idx].isDeployed // false)
💰 Lifetime Donations: $\(.lifetimeContributionsUsdc // "0")
🌐 Website: \(.website // "N/A")
📝 Description: \(.description // "N/A" | .[0:200])..."
'
exit 0
fi
# Name search
ENCODED=$(echo "$QUERY" | jq -sRr @uri)
echo "🔍 Searching for: $QUERY (on $CHAIN)"
echo "---"
RESPONSE=$(curl -s "https://api.endaoment.org/v1/orgs?search=${ENCODED}&limit=5" \
-H "Accept: application/json")
if [[ -z "$RESPONSE" ]] || [[ "$RESPONSE" == "[]" ]]; then
echo "No results found for: $QUERY"
echo ""
echo "💡 Tip: Try searching by EIN for exact match (e.g., 27-1661997)"
exit 0
fi
echo "$RESPONSE" | jq -r --argjson idx "$CHAIN_IDX" '
.[] |
"📛 Name: \(.name)
🆔 EIN: \(.ein)
📍 Contract: \(.deployments[$idx].contractAddress // "N/A")
✅ Deployed: \(.deployments[$idx].isDeployed // false)
---"
' 2>/dev/null || echo "Error parsing response"