Compare commits

...

5 Commits

18 changed files with 285 additions and 12 deletions

View File

@ -24,11 +24,14 @@ const (
USERFLAG_ACCOUNT_PENDING
USERFLAG_ACCOUNT_SUCCESS
USERFLAG_ACCOUNT_UNLOCKED
invalidRecipient
invalidRecipientWithInvite
)
const (
createAccountURL = "https://custodial.sarafu.africa/api/account/create"
trackStatusURL = "https://custodial.sarafu.africa/api/track/"
checkBalanceURL = "https://custodial.sarafu.africa/api/account/status/"
)
type accountResponse struct {
@ -53,6 +56,14 @@ type trackStatusResponse struct {
} `json:"result"`
}
type balanceResponse struct {
Ok bool `json:"ok"`
Result struct {
Balance string `json:"balance"`
Nonce json.Number `json:"nonce"`
} `json:"result"`
}
type fsData struct {
path string
st *state.State
@ -262,6 +273,212 @@ func (fsd *fsData) quit(ctx context.Context, sym string, input []byte) (resourc
return res, nil
}
func (fsd *fsData) checkBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
resp, err := http.Get(checkBalanceURL + accountData["PublicKey"])
if err != nil {
return res, nil
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return res, nil
}
var balanceResp balanceResponse
err = json.Unmarshal(body, &balanceResp)
if err != nil {
return res, nil
}
balance := balanceResp.Result.Balance
res.Content = balance
return res, nil
}
func (fsd *fsData) validate_recipient(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
recipient := string(input)
res.FlagReset = []uint32{invalidRecipient}
res.FlagReset = []uint32{invalidRecipientWithInvite}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
// mimic invalid number check
if recipient == "000" {
res.FlagSet = []uint32{invalidRecipient}
res.Content = recipient
return res, nil
}
accountData["Recipient"] = recipient
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
return res, nil
}
func (fsd *fsData) transaction_reset(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
// reset the recipient
accountData["Recipient"] = ""
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
res.FlagReset = []uint32{invalidRecipient}
res.FlagReset = []uint32{invalidRecipientWithInvite}
return res, nil
}
func (fsd *fsData) max_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
// mimic a max amount
res.Content = "10.00"
return res, nil
}
func (fsd *fsData) validate_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
amount := string(input)
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
// mimic invalid amount check
if amount == "0" {
// res.FlagSet = []uint32{invalidAmount}
res.Content = amount
return res, nil
}
res.Content = amount
accountData["Amount"] = amount
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
return res, nil
}
func (fsd *fsData) get_recipient(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
res.Content = accountData["Recipient"]
return res, nil
}
func (fsd *fsData) get_sender(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
res.Content = accountData["PublicKey"]
return res, nil
}
var (
scriptDir = path.Join("services", "registration")
@ -283,10 +500,9 @@ func main() {
st := state.NewState(7)
st.UseDebug()
state.FlagDebugger.Register(USERFLAG_LANGUAGE_SET, "LANGUAGE_CHANGE")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED,"ACCOUNT_CREATED")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_SUCCESS,"ACCOUNT_SUCCESS")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_PENDING,"ACCOUNT_PENDING")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED, "ACCOUNT_CREATED")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_SUCCESS, "ACCOUNT_SUCCESS")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_PENDING, "ACCOUNT_PENDING")
rfs := resource.NewFsResource(scriptDir)
ca := cache.NewCache()
@ -326,7 +542,14 @@ func main() {
rfs.AddLocalFunc("check_identifier", fs.checkIdentifier)
rfs.AddLocalFunc("check_account_status", fs.check_account_status)
rfs.AddLocalFunc("unlock_account", fs.unlock)
rfs.AddLocalFunc("quit",fs.quit)
rfs.AddLocalFunc("quit", fs.quit)
rfs.AddLocalFunc("check_balance", fs.checkBalance)
rfs.AddLocalFunc("validate_recipient", fs.validate_recipient)
rfs.AddLocalFunc("transaction_reset", fs.transaction_reset)
rfs.AddLocalFunc("max_amount", fs.max_amount)
rfs.AddLocalFunc("validate_amount", fs.validate_amount)
rfs.AddLocalFunc("get_recipient", fs.get_recipient)
rfs.AddLocalFunc("get_sender", fs.get_sender)
cont, err := en.Init(ctx)
if err != nil {

@ -1 +1 @@
Subproject commit ef9a4c3073e7e878846693d4aa7fd0cf1cc977a7
Subproject commit 1f47a674d95380be8c387f410f0342eb72357df5

View File

@ -0,0 +1,2 @@
Maximum amount: {{.max_amount}}
Enter amount:

View File

@ -0,0 +1,9 @@
LOAD max_amount 0
MAP max_amount
MOUT back 0
HALT
INCMP ^ 0
LOAD validate_amount 0
LOAD get_recipient 12
LOAD get_sender 64
MOVE transaction_pin

View File

View File

@ -0,0 +1 @@
{{.validate_recipient}} is not registered or invalid, please try again:

View File

@ -0,0 +1,7 @@
MAP validate_recipient
LOAD transaction_reset 0
MOUT retry 1
MOUT quit 9
HALT
INCMP send 1
INCMP quit 9

View File

@ -0,0 +1 @@
{{.validate_recipient}} haijasajiliwa au sio sahihi, tafadhali weka tena:

View File

@ -1,2 +1 @@
Balance: 0.00 SRF
Balance: {{.check_balance}}

View File

@ -1,9 +1,15 @@
LOAD check_identifier 64
RELOAD check_identifier
MAP check_identifier
LOAD check_balance 64
RELOAD check_balance
MAP check_balance
MOUT send 1
MOUT vouchers 2
MOUT account 3
MOUT help 4
MOUT quit 9
HALT
INCMP send 1
INCMP vouchers 2
INCMP my_account 3
INCMP help 4
INCMP quit 9
INCMP . *

View File

@ -1 +1 @@
Salio: 0.00 SRF
Salio: {{.check_balance}}

View File

@ -3,3 +3,4 @@ MOUT kiswahili 1
HALT
INCMP terms 0
INCMP terms 1
INCMP . *

View File

@ -0,0 +1 @@
Enter recipient's phone number:

View File

@ -0,0 +1,7 @@
LOAD transaction_reset 0
MOUT back 0
HALT
INCMP ^ 0
LOAD validate_recipient 0
MAP validate_recipient
MOVE amount

View File

@ -0,0 +1 @@
Weka nambari ya simu:

View File

@ -0,0 +1,2 @@
{{.get_recipient}} will receive {{.validate_amount}} from {{.get_sender}}
Please enter your PIN to confirm:

View File

@ -0,0 +1,11 @@
RELOAD validate_amount
MAP validate_amount
RELOAD get_recipient
MAP get_recipient
RELOAD get_sender
MAP get_sender
MOUT back 0
MOUT quit 9
HALT
INCMP ^ 0
INCMP quit 9

View File

@ -0,0 +1,2 @@
{{.get_recipient}} atapokea {{.validate_amount}} kutoka kwa {{.get_sender}}
Tafadhali weka PIN yako kudhibitisha: