A production-grade Telegram bot for sending, requesting, and splitting USDC payments on Arc Network testnet (chain ID 5042002).
On Arc Network, USDC is the native gas token (not an ERC20 contract). All transactions use simple native value transfers, like sending ETH on Ethereum.
- Balance queries use
eth_getBalance - Transfers are 21,000-gas value transfers
- USDC uses 18 decimals on Arc (same as ETH)
/balance— Check your USDC balance/deposit— Show deposit address + faucet link/withdraw <address> <amount>— Withdraw to external address
/send @user <amount> [memo]— Send USDC to another Telegram user/tip @user <amount>— Quick tip in group chats/receipt <tx_hash>— Generate receipt image
/request @user <amount> <reason>— Request payment/pay <request_id>— Fulfill a request
/split <amount> <reason> @user1 @user2 ...— Split an expense
/link <amount> [reason]— Create a shareable payment link
/history— View your last 20 transactions
Both sender and receiver must /start the bot first — this registers their Telegram username → wallet address mapping.
If the recipient hasn't started the bot:
@someonehasn't registered with ArcPay yet. Ask them to/startfirst, or use/withdraw <address>directly.
- Run
/depositto get your wallet address - Visit https://faucet.circle.com
- Select Arc Testnet
- Paste your address and request USDC
- Real on-chain transactions with receipt polling
- Dynamic gas pricing (10% buffer)
- Incoming payment notifications
- Deep-link payment links (
t.me/bot?start=pay_XXX) - Rate limiting
- Structured JSON logging
- Multi-stage Docker build
- Fernet-encrypted private keys
Optional ArcPayEscrow at 0x67aF28a3383b1c1343D7264EEc90a3aD87A7a72A for on-chain payment requests.
cp .env.example .env
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# Paste as WALLET_ENCRYPTION_KEY
pip install -r requirements.txt
python -m bot.main- Create Web Service from this repo
- Docker runtime
- Set env vars from
.env.example - Deploy
MIT