Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

ROSCA Groups

Who it's for: Market women, traders, and salaried workers who want to save together and take turns receiving a lump sum — just like a traditional susu or tontine. Why it matters: ROSCA groups eliminate the middleman — no bank account needed, contributions are enforced on-chain, and payouts happen automatically to the elected recipient.

ROSCA (Rotating Savings and Credit Association) is the digital version of the African susu — a group of people pool contributions each cycle, and one member receives the full pot.

POST /group/create

Deploy a new savings group (createGroup on-chain). The admin sets all group parameters upfront.

Request
{
  "adminAddressId": "wallet-uuid",
  "adminAddress": "0xabc...",
  "config": {
    "groupName": "Market Women GH Q1",
    "amountPerPerson": "50000000",
    "adminFeeBps": 100,
    "contributionPeriod": 2592000,
    "currency": "0x3126627A607E730E3eCF9BbfFD67fa18Deaab846",
    "collateralAmount": "10000000",
    "requireCollateral": true,
    "maxParticipants": 12,
    "biddingEnabled": false,
    "defaultHandlingEnabled": true,
    "interestEnabled": false,
    "midCycleJoinEnabled": false,
    "midCycleLeaveEnabled": false,
    "loanIntegrationEnabled": false,
    "resetEnabled": false,
    "biddingPeriod": 0,
    "minimumBidAmount": "0",
    "gracePeriod": 86400,
    "maxMissedContributions": 1,
    "interestRate": 0
  }
}
FieldNotes
amountPerPersonPer-cycle contribution in base units (6 dec for cGHS)
contributionPeriodSeconds between contribution rounds
collateralAmountRequired collateral per participant (if requireCollateral)
currencycGHS address: 0x3126627A607E730E3eCF9BbfFD67fa18Deaab846
adminFeeBpsAdmin fee in basis points (100 = 1%)
gracePeriodSeconds after due date before a missed contribution is counted
Response
{ "id": "d1-uuid", "status": "pending" }

POST /group/:groupId/join

Join a group by depositing collateral (if required).

Request
{
  "userAddressId": "wallet-uuid",
  "userAddress": "0xabc..."
}

The Transaction batch call is: [approve(diamond, collateralAmount), joinGroup(groupId)].


POST /group/:groupId/contribute

Pay your contribution for the current cycle.

Request
{
  "userAddressId": "wallet-uuid",
  "userAddress": "0xabc...",
  "amount": "50000000"
}

POST /group/:groupId/vote

Vote for who should receive the pot this cycle (if voting is enabled).

Request
{
  "userAddressId": "wallet-uuid",
  "userAddress": "0xabc...",
  "candidate": "0xdef..."
}

POST /group/:groupId/disburse

Admin disburses the cycle pot to the elected recipient.

Request
{
  "adminAddressId": "wallet-uuid",
  "adminAddress": "0xabc...",
  "recipient": "0xdef..."
}

POST /group/:groupId/advance

Advance to the next cycle (admin only).


Read Endpoints

GET  /group/:groupId              — on-chain group state (viem)
GET  /group/:groupId/participants — all participant addresses
GET  /group/user/:address         — groups the user belongs to (D1)
GET  /group/contribution/:id      — contribution status (D1)