cic-docs/spec/007_eMoney_integration.md

3.6 KiB

Incoming Sarafu

When users exchange CICfor National Currency we have to manually send them Mpesa. We would like to automate this.

Outgoing Sarafu

When anyone sends us Mpesa on our paybill we have to manuall send them Sarafu

Solution

Configure - using our own system AfricasTalking API to automatically send Sarafu / Mpesa based on rules:

Incoming Sarafu Rules

  • white list The chama (group accounts only) must only be able to cash out - using the exchange option to an Agent account
  • amount The max cash out is the minimum of (30,000 Sarafu, half their balance, their total amount of outward trade volume to other users (standard transactions)
  • time They can only cash out once per month
  • rate The Sarafu (and their community) to Mpesa rate should be calculated as follows:
    • CIC_supply_b: Get the total CIC supply off blockchain - the amount of CIC_burn
    • total_reserve_b: Get the total reserve off blockchain - the amount of cash_out we've gotten (in USD)
    • CIC_burn_amount = whatever they have sent to exhange

The Reserve (xDAI) pulled out

const reserveOut_xDAI = total_reserve_b * (Math.pow(1 + (-1 * CIC_burn) / CIC_supply_b, 1 / trr) - 1);

  • Mpesa_out = reserveOut_xDAI USD => KSH rate
  • reserve_given = reserve_out - CIC_created*fee (0.02)
  • Simulate as if done on blockchain .... new_cic_supply_b = cic_supply_b - CIC_burn
  • Simulate as if done on blockchain .... new_total_reserve_b = total_reserve_b - reserveOut_xDAI

Outgoing Sarafu Rules

  • white list Only users sending via paybill receive Sarafu. Non users receive a invitation to join Sarafu sms (alert to admins there was a donation).
  • amount The max sarafu out is 20,000 Sarafu per user, KYC_limit max, supply_max
  • time No limit
  • rate The Mpesa to Sarafu (and their community) rate should be calculated as follows:
    • CIC_supply_b: Get the total CIC supply off blockchain + the amount of CIC_given
    • total_reserve_b: Get the total reserve off blockchain + the amount of cash_in we've gotten (in USD)
    • cash_in_amount = Mpesa_in KSH -> USD rate (what is the current USD <> KSH rate)

The amount cashed in = cash_in_amount

const CIC_Created = cic_supply_b * (Math.pow(1 + cash_in_amount / total_reserve_b, trr) - 1);

  • CIC_given = CIC_Created - CIC_created*fee (0.02)
  • Simulate as if done on blockchain .... new_cic_supply_b = cic_supply_b + CIC_given
  • Simulate as if done on blockchain .... new_total_reserve_b = total_reserve_b + cash_in_amount

Security

  • Balance alerts: On both Mpesa and CIC balances: The paybill from which Sarafu is sent needs to send a sms and email alert when low
  • Failure alerts: If the API session fails an sms and email alert should be sent
  • Reject on not enough Mpesa balance: If there is not enough Mpesa (on incoming Sarafu) the transaction should be rejected and an email sent to admin along with a SMS to admin and user (Sarafu should not be taken from user). (message should be visible also on mgmt platform txn view and user view and admin view).
  • Reject on not enough Sarafu balance: If there is not enough Sarafu (on incoming Mpesa) the transaction should be rejected and an email sent to admin along with a SMS to admin and user (Mpesa should not be taken from user). (message should be visible also on mgmt platform txn view and user view and admin view).

Variables

  • The account from which Sarafu is sent should be a Agent account
  • The cash-out rules for a chama (minimum and time limit)
  • Alert balance levels
  • Fees: Mpesa to Sarafu
  • Fees: Sarafu to Mpesa