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
Share this project:

Updates