
SIngIt
An agent that buys things for you, and asks your Ledger before it pays a stranger.
Demo
About
SingIt is an AI purchasing agent that helps people buy digital products and access paid services through a conversational interface. Users interact with a Telegram bot to find products, review prices and approve purchases, with USDC payments settled on Base. The project addresses a practical problem with AI agents: an agent may understand what a user wants, but that does not mean it should have unrestricted permission to spend their money. SingIt separates the agent’s request from payment authorization. An existing spending-policy library remembers previous payments, checks spending limits, detects changes in a merchant’s payout address and asks for human approval when a payment needs review. This ETHOnline Continuity submission extends the existing product with two main integrations: Ledger and The Graph. Ledger adds hardware-backed purchase approval. For supported paid API purchases, the gateway creates a persistent order before requesting approval. The owner reviews a compact message on their Ledger showing the purchase, amount, network and recipient. A cryptographic reference binds the approval to the complete order. The gateway verifies the signature, rechecks the payment conditions and executes the approved purchase. Repeated requests return the saved result without submitting another payment. The Ledger signs the approval; the gateway wallet executes the payment. An optional Ledger Key Ring integration also protects the gateway’s wallet-encryption key on enrolled hosts. The Graph supplies paid blockchain data for the agent. The integration retrieves Uniswap V3 pool prices on Base through The Graph’s x402 gateway. Each query passes through the spending policy, and its payment receipt and answer are recorded in the journal. Repeating the same query within the cache window returns the stored answer without another payment. Answers identify their source pool, indexed block and cache status. The Graph adapter is published as a reusable open-source Python library, so other agents can use it independently of SingIt. Verification includes a real Ledger-approved API purchase, a separate hardware check of the final readable approval format, and a real WETH price query costing 0.01 USDC. That price was independently checked against the pool’s contract state, and two subsequent requests returned cached data without additional payments. These additions were developed and tested on the hackathon branch. The submission documents the pre-existing product, the new implementation and the evidence supporting each integration. The ETHOnline 2026 implementation is on the ethonline branch of bubon-ik/SingItAI. Please review that branch for the hackathon changes. https://github.com/bubon-ik/SingItAI/tree/ethonline
How it's made
SingIt combines a Python gateway, a Telegram interface and a Node.js payment service. For ETHOnline, I extended the existing application with Ledger approval and The Graph integration, building on its existing spending-policy library and Base USDC payment infrastructure. The Python gateway coordinates purchase requests, policy decisions, approvals and receipts. The Node.js service uses Coinbase’s CDP SDK and an x402 client to access paid resources. The spending-policy library is maintained in a separate open-source repository, allowing other agents to reuse it independently. For Ledger, I used the Device Management Kit and Ethereum signer SDK through a local Node.js client. The gateway freezes the purchase details and stores an encrypted operation record in SQLite before requesting a signature. After approval, it verifies the signature, rechecks the quote and spending limits, and atomically consumes the operation before invoking the payer. Completed requests return their stored result on retry. One practical challenge was device readability: the initial typed-data approval displayed technical fields instead of a useful purchase summary. I switched to compact EIP-191 personal_sign messages containing the purchase, amount, network and recipient. A 43-character base64url SHA-256 reference commits to the complete order, including its resource, owner and expiry. This keeps the device review short while preserving the binding to the full purchase. Ledger signs this off-chain approval; the gateway wallet signs the payment. I also added an optional wallet-cli ring backend for decrypting the gateway’s wallet-encryption key on enrolled hosts. Startup fails if decryption cannot complete. The Graph integration sends parameterized GraphQL queries to the Uniswap V3 subgraph on Base through its x402 gateway. The reusable adapter fingerprints the deployment, query and variables, then checks the journal before accessing the network. Identical queries within the default 300-second cache window reuse the stored answer without another payment. The chat integration includes the source pool, indexed block and cache status. Live testing exposed two integration bugs: the gateway rejected Python’s default User-Agent, and the receipt handler expected a different transaction-hash field from the CDP client. Both were fixed and covered by regression tests. I verified the paid WETH query independently by reading the pool’s token addresses and slot0 state through Base RPC at the same block, then confirmed that cached repeats survived reopening the database and running in a separate process.