Inspiration
Splitting shared costs is messy, we wanted a trust-minimized way to pool funds, refund automatically if goals aren’t met, and provide transparent receipts.
What it does
It lets anyone create a bill with target, payee, and optional deadline. Contributors send ETH and receipt tokens mint on contribution and burn on refund. Payees withdraw when targets are met; contributors refund if deadlines pass unfunded. Optional reward pool to incentivize participation.
How we built it
Solidity contracts: ExpenseShare (bills, contribute/withdraw/refund, rewards) and ReceiptToken (mint/burn via minter role). OpenZeppelin Ownable + ReentrancyGuard for safety. Hardhat + ethers v6 for builds and deploys. Frontend: JS + ethers UMD to create/contribute/withdraw/refund and view events. Base Sepolia for low-fee testing.
Challenges we ran into
Preventing reentrancy and bad edge cases around refunds/withdrawals. Handling RPC log limits and rate limits when syncing state. Keeping frontend UX clear on failure reasons (missing bills, underfunded, deadlines).
Accomplishments that we're proud of
Clean, minimal contracts with clear revert paths. Working frontend that surfaces on-chain events and validation. Optional reward pool mechanism on top of basic funding/refund flows.
What we learned
The importance of deterministic state checks before sending txs. Handling provider constraints (chunked log queries, clear error surfacing). Keeping UX simple while exposing detailed on-chain state.
What's next for ExpenseShare
Improve UI polish and mobile responsiveness. Automation/notifications as an external service (e.g., webhook-based). Add agent to automate tasks.
Built With
- base
- ethers-v6
- evm
- hardhat
- javascript/html/css-(ethers-umd)
- l2)
- openzeppelin-contracts
- sepolia
- solidity
Log in or sign up for Devpost to join the conversation.