Compare commits

...

235 Commits

Author SHA1 Message Date
alfred-mk
3592e7747c add a test case with large decimal amount 2025-06-26 12:30:44 +03:00
alfred-mk
7fe40faa9d use the TruncateDecimalString helper function to format amounts to 2 d.p 2025-06-26 12:30:14 +03:00
alfred-mk
02fd02dc21 add a test for the TruncateDecimalString 2025-06-26 12:26:49 +03:00
alfred-mk
b884b82197 add test cases with high decimals for the ParseAndScaleAmount func 2025-06-26 12:20:34 +03:00
alfred-mk
280c382a3d add a helper function 'TruncateDecimalString' to format amounts to specified decimal places 2025-06-26 12:19:13 +03:00
alfred-mk
88926480dc Return finalAmount as a string with 0 decimal places (rounded) 2025-06-24 15:11:15 +03:00
alfred-mk
dabdf7eba2 add a test case to ensure the stored amount is not rounded off 2025-06-24 14:55:37 +03:00
alfred-mk
96f6ca7d08 truncate two decimal places without risking float rounding issues 2025-06-24 14:55:09 +03:00
alfred-mk
bc48dddd99 use the correct ContractAddress for the Last10TxResponse struct 2025-06-24 14:04:07 +03:00
alfred-mk
2ec612978d update sarafu-api to correctly unmarshal nested pool details response in RetrievePoolDetails
Some checks failed
release / docker (push) Has been cancelled
2025-06-24 12:10:04 +03:00
alfred-mk
632f891e16 use the updated alias endpoints from the sarafu-api
Some checks failed
release / docker (push) Has been cancelled
2025-06-24 10:51:15 +03:00
alfred-mk
d758b37065 use the correct TokenHoldings struct instead of TokenDetails
Some checks failed
release / docker (push) Has been cancelled
2025-06-23 11:09:47 +03:00
alfred-mk
929fb6a40d add logs for the request and response body 2025-06-23 10:57:20 +03:00
alfred-mk
5263af46d8 use a single ProcessVouchers due to similar data struct
Some checks failed
release / docker (push) Has been cancelled
2025-06-23 10:09:39 +03:00
alfred-mk
383ef51134 use the TokenAddress instead of ContractAddress 2025-06-23 10:07:53 +03:00
alfred-mk
5479580230 use the TokenHoldings instead of TokenDetails in getting the pool swappable vouchers
Some checks failed
release / docker (push) Has been cancelled
2025-06-23 09:50:13 +03:00
alfred-mk
6f2d965b89 add log for the GetCurrentProfileInfo
Some checks failed
release / docker (push) Has been cancelled
2025-06-23 08:56:37 +03:00
alfred-mk
150dc99201 log the response from GetPoolSwappableVouchers
Some checks failed
release / docker (push) Has been cancelled
2025-06-19 14:54:43 +03:00
alfred-mk
b85c5a8788 log the metadata from GetSwapToVoucherData
Some checks failed
release / docker (push) Has been cancelled
2025-06-19 14:17:43 +03:00
alfred-mk
23f1068402 Use InfoCtxf instead of TraceCtxf 2025-06-19 14:17:08 +03:00
alfred-mk
e803048b13 Added more logging and display the actual activePoolSymbol
Some checks failed
release / docker (push) Has been cancelled
2025-06-19 12:54:33 +03:00
alfred-mk
137a5dd599 cosmetic-fixes (#83)
Some checks failed
release / docker (push) Has been cancelled
Resolved issue #80

Reviewed-on: #83
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-06-19 10:30:31 +02:00
61ff337464 Merge pull request 'hotfix/v1.2.5-rc.1' (#82) from hotfix/v1.2.5-rc.1 into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #82
2025-06-18 11:53:30 +02:00
alfred-mk
41c3b6d8e6 Merge branch 'master' into hotfix/v1.2.5-rc.1 2025-06-18 12:41:28 +03:00
alfred-mk
42dadb5eea add-pool-selection (#79)
Some checks failed
release / docker (push) Has been cancelled
- Add pool selection under "Select vouchers" node
- Use the set pool contract address in the swap, or fall back to the default

Reviewed-on: #79
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-06-09 13:38:19 +02:00
alfred-mk
7228b818e3 swap-fix (#78)
Some checks failed
release / docker (push) Has been cancelled
- Resolves a "key not found error" on the swap max limit node
- Resolves double PIN requests when authorizing transactions #67

Reviewed-on: #78
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-06-03 09:19:13 +02:00
alfred-mk
3b44b4b9e7 updated go-vise to add full memory reset method
Some checks failed
release / docker (push) Has been cancelled
2025-05-28 16:09:15 +03:00
alfred-mk
7c2454422e remove misplaced CATCH statement
Some checks failed
release / docker (push) Has been cancelled
2025-05-23 16:54:05 +03:00
alfred-mk
95de1dad2b updated the go-vise package to commit hash a170e8a79da067e30b3c28a999a4d87fdd07ebaf 2025-05-23 16:53:10 +03:00
alfred-mk
fac703576f updated the go-vise package to commit hash a170e8a79da067e30b3c28a999a4d87fdd07ebaf
Some checks failed
release / docker (push) Has been cancelled
2025-05-23 15:30:48 +03:00
alfred-mk
df8e0b4d4a remove misplaced CATCH statement 2025-05-23 15:28:40 +03:00
alfred-mk
b4bacfdc03 use the updated sarafu-api package with correct PoolSwapURL
Some checks failed
release / docker (push) Has been cancelled
2025-05-22 15:34:04 +03:00
alfred-mk
8dc203d111 use the TemporaryValue to store the user's swap amount input
Some checks failed
release / docker (push) Has been cancelled
2025-05-22 15:18:52 +03:00
alfred-mk
dcadea8737 Convert TokenDecimals (uint8) to string before storing it 2025-05-22 15:09:46 +03:00
alfred-mk
71496d0015 change position of the catch statements
Some checks failed
release / docker (push) Has been cancelled
2025-05-22 12:41:49 +03:00
alfred-mk
d9fc5440c5 prevent access to the swap menu if one does not have a voucher 2025-05-22 12:24:10 +03:00
alfred-mk
0495472530 match the reset_incorrect_pin symbol to the function name 2025-05-22 12:13:50 +03:00
alfred-mk
fd43060021 update the api failure template
Some checks failed
release / docker (push) Has been cancelled
2025-05-21 18:52:05 +03:00
alfred-mk
cf6e105fb9 catch the api call error flag 2025-05-21 18:51:41 +03:00
alfred-mk
91b57fece2 use the ProcessTokens function and remove the unused DATA_POOL_TO_BALANCES 2025-05-21 18:51:10 +03:00
alfred-mk
043c79384c correctly process TokenDetails 2025-05-21 18:39:45 +03:00
alfred-mk
1cc1d00ffe added a function to ProcessTokens from the GetPoolSwappableVouchers 2025-05-21 18:19:23 +03:00
alfred-mk
d7987bf460 use the updated ussd-data-service and sarafu-api with TokenDetails 2025-05-21 18:18:15 +03:00
alfred-mk
21da4b976b use the updated sarafu-api that removes the publicKey from the GetPoolSwappableVouchers
Some checks failed
release / docker (push) Has been cancelled
2025-05-21 15:45:17 +03:00
alfred-mk
169d85e2cb added the INCLUDE_STABLES_PARAM env variable 2025-05-21 15:39:19 +03:00
alfred-mk
3ab76b3d22 use updated sarafu-api with corrected JSON mapping for checkTokenInPool and getSwapFromTokenMaxLimit
Some checks failed
release / docker (push) Has been cancelled
2025-05-20 15:53:12 +03:00
alfred-mk
b428e2e22d add log for the CheckTokenInPool
Some checks failed
release / docker (push) Has been cancelled
2025-05-20 14:02:41 +03:00
1d23a0cc4b Merge pull request 'default-env-pool' (#76) from default-env-pool into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #76
2025-05-20 12:18:30 +02:00
alfred-mk
d3ad3b2db6 update the template and remove hardcoded values 2025-05-20 10:26:28 +03:00
alfred-mk
5d8fee470a use the default pool variables 2025-05-20 10:26:01 +03:00
alfred-mk
cf237c592a add the pool variables to the config 2025-05-20 10:25:27 +03:00
alfred-mk
2d8333b89a add the new env variables 2025-05-20 10:19:46 +03:00
alfred-mk
c8146ea211 alfred/pool-swap (#33)
Some checks failed
release / docker (push) Has been cancelled
Pool swap functionality

Resolves issue #24

Reviewed-on: #33
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-19 15:44:50 +02:00
alfred-mk
d03c0c4c0e vouchers-input-selection (#75)
Some checks failed
release / docker (push) Has been cancelled
- Update the NEXT and PREV input selectors on the vouchers list
- Have the INCMPs before LOAD/RELOADs to prevent navigation inputs being passed to handler functions

Reviewed-on: #75
Reviewed-by: Mohamed Sohail <kamikazechaser@noreply.localhost>
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-19 15:42:43 +02:00
alfred-mk
e914d059e2 upgraded vise to refresh error logline for more context
Some checks failed
release / docker (push) Has been cancelled
2025-05-07 20:26:54 +03:00
alfred-mk
7b1676bb37 fixes: recipient address and phone number (#74)
Some checks failed
release / docker (push) Has been cancelled
- Add functionality to checksum addresses...resolves #66
- Remove white spaces from the recipient input...resolves #70

Reviewed-on: #74
Reviewed-by: Mohamed Sohail <kamikazechaser@noreply.localhost>
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-07 11:45:38 +02:00
carlos
db5d55d8e3 Merge pull request 'route-api-errors' (#46) from route-api-errors into master
Reviewed-on: #46
2025-04-29 13:55:54 +02:00
Carlosokumu
06cab56427 fix failing tests: menuhandlers missing the logdb 2025-04-29 13:25:31 +03:00
Carlosokumu
d0c181bca2 Merge branch 'master' into route-api-errors 2025-04-29 12:58:46 +03:00
e379129b3d Merge pull request 'logdb' (#56) from logdb into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #56
2025-04-29 09:15:50 +02:00
Carlosokumu
29d35d1ec4 add write of the temporary and confirmed account pins to the log db 2025-04-28 15:49:40 +03:00
alfred-mk
687447e73e added the logdb to the testutil engine 2025-04-28 15:09:38 +03:00
alfred-mk
ec1ddefeb3 updated packages for sarafu-api and vise 2025-04-28 12:50:36 +03:00
alfred-mk
4166c9aed5 Merge branch 'master' into logdb 2025-04-28 12:38:27 +03:00
alfred-mk
78e82edfb5 added the logdn to the menuhandler tests 2025-04-28 12:26:06 +03:00
Carlosokumu
a5c4866b23 add required logdb to menuhandler 2025-04-28 11:50:25 +03:00
Carlosokumu
b52239e6be use direct key data type 2025-04-28 11:50:10 +03:00
Carlosokumu
5f02df64d7 upgrade visedriver dep 2025-04-28 11:40:28 +03:00
alfred-mk
0ba65fc48c use the updated phone and alias regexes from common 2025-04-28 11:39:37 +03:00
alfred-mk
ce8cc8e0fd use latest commit from sarafu-api 2025-04-28 11:38:45 +03:00
Carlosokumu
1499e4a29a check recipient before sending an sms 2025-04-28 11:38:44 +03:00
Carlosokumu
5f24ff3b1b feat: send invites when a recipient
is not resolved
2025-04-28 11:38:44 +03:00
Carlosokumu
6cdee7b58b update sarafu-api dep 2025-04-28 11:38:43 +03:00
alfred-mk
af5537abfc updated the description of DATA_SELF_PIN_RESET 2025-04-28 11:37:45 +03:00
alfred-mk
a6e569afb1 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
446514d8ce remove unused function reset_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
131d106f38 use a single confirm_pin_change node 2025-04-28 11:37:43 +03:00
alfred-mk
4d62f0222e use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-28 11:37:43 +03:00
alfred-mk
37cc3e1bc1 cleanup: remove extra space in all .vis files 2025-04-28 11:37:42 +03:00
alfred-mk
491e97d8af cleanup: remove extra space 2025-04-28 11:37:42 +03:00
alfred-mk
d4fefe3c39 update the order for the INCMP statement 2025-04-28 11:37:41 +03:00
alfred-mk
e8ff468c7b update the reset flags in TestCheckBlockedStatus 2025-04-28 11:37:41 +03:00
alfred-mk
965f343230 update the reset flags in TestConfirmPinChange 2025-04-28 11:37:40 +03:00
alfred-mk
3426d31a9e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-28 11:37:40 +03:00
alfred-mk
8b2b667307 updated the expected content for the alias in view profile 2025-04-28 11:37:39 +03:00
alfred-mk
c206fa1329 updated the menu flow for the admin reset others PIN in test 2025-04-28 11:37:39 +03:00
alfred-mk
ad395c4b1a remove code related to admins resetting a user's actual PIN 2025-04-28 11:37:38 +03:00
alfred-mk
af7e6cc603 add a space 2025-04-28 11:37:38 +03:00
alfred-mk
f90a188acc updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-28 11:37:37 +03:00
alfred-mk
7a542d1f1c updated the description of the flag_incorrect_pin 2025-04-28 11:37:37 +03:00
alfred-mk
7d800d68a0 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-28 11:37:36 +03:00
alfred-mk
850458b5d8 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-28 11:37:36 +03:00
alfred-mk
ef8e3d5c35 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-28 11:37:35 +03:00
alfred-mk
982eebf374 move to the top node when one selects back 2025-04-28 11:37:35 +03:00
alfred-mk
228d936a0e use the confirm_self_pin_reset to confirm the new PIN 2025-04-28 11:37:34 +03:00
alfred-mk
7c4d37b5b8 use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
e6e8bb6671 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
6385735b89 move back to the previous node if the admin user is not authorized 2025-04-28 11:34:27 +03:00
alfred-mk
70815aabd1 request the admin to authorize the PIN reset 2025-04-28 11:34:27 +03:00
alfred-mk
919899c704 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-28 11:34:26 +03:00
alfred-mk
9a2ad99d07 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-28 11:34:26 +03:00
alfred-mk
2f4959e191 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-28 11:34:25 +03:00
alfred-mk
1b2f3bb046 added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-28 11:34:24 +03:00
carlos
19a2b28367 Merge pull request 'extra-sms' (#64) from extra-sms into master
Reviewed-on: #64
2025-04-28 10:33:25 +02:00
alfred-mk
25d124c58d use updated go-vise that removes rollback on missing key 2025-04-25 17:10:46 +03:00
alfred-mk
5b34ef28eb added the logDb to async and http 2025-04-25 09:33:08 +03:00
Carlosokumu
0370a3def4 use dedicated smsservice for triggering extra sms 2025-04-18 12:13:24 +03:00
Carlosokumu
7c0651d218 use dedicated sms package for triggering sms 2025-04-18 12:12:33 +03:00
Carlosokumu
a38ac06a3d trigger an address sms in the check_identifier handler 2025-04-18 10:56:41 +03:00
Carlosokumu
ac2a3721b2 remove dedicated address sms trigger 2025-04-18 10:55:02 +03:00
Carlosokumu
7ea3cb6b51 remove reload for check identifier to prevent double address sms trigger 2025-04-18 10:54:23 +03:00
Carlosokumu
0274133d48 add handler to send an address sms 2025-04-17 23:32:05 +03:00
Carlosokumu
5ff2e794ff feat: implement address and pin reset sms 2025-04-17 23:31:48 +03:00
Carlosokumu
08deeca500 register handler to trigger address sms 2025-04-17 23:31:22 +03:00
Carlosokumu
cea920c1f5 dep: upgrade sarafu-api dep to include address and pin reset sms 2025-04-17 23:30:54 +03:00
ade236747c Merge pull request 'use the updated phone and alias regexes from common' (#63) from update-recipient-validator into master
Reviewed-on: #63
2025-04-17 16:53:42 +02:00
alfred-mk
e1a3729e3b use the updated phone and alias regexes from common 2025-04-17 14:31:18 +03:00
Carlosokumu
f127fd7c0f initialize log db ,attach it to the menuhandler 2025-04-14 11:34:37 +03:00
alfred-mk
42177aadeb use latest commit from sarafu-api
Some checks failed
release / docker (push) Has been cancelled
2025-04-11 11:10:48 +03:00
fa9f1a72ef Merge pull request 'self pin reset' (#49) from self-pin-reset-node into master
Reviewed-on: #49
2025-04-11 09:26:11 +02:00
alfred-mk
4ffb32f14a Merge branch 'master' into self-pin-reset-node 2025-04-11 10:25:35 +03:00
c41277db87 Merge pull request 'sms-upsell' (#55) from sms-upsell into master
Reviewed-on: #55
2025-04-11 09:24:35 +02:00
alfred-mk
56cda36aa7 updated the description of DATA_SELF_PIN_RESET 2025-04-10 13:55:00 +03:00
alfred-mk
c9170ca45a Merge branch 'master' into self-pin-reset-node 2025-04-09 23:43:10 +03:00
alfred-mk
57a1645c03 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-09 23:40:03 +03:00
alfred-mk
7d9c3b66a9 remove unused function reset_valid_pin 2025-04-09 19:29:40 +03:00
alfred-mk
aec1f4c4c1 use a single confirm_pin_change node 2025-04-09 19:23:46 +03:00
alfred-mk
d680387ef1 use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-09 19:21:35 +03:00
alfred-mk
0337c66f96 cleanup: remove extra space in all .vis files 2025-04-09 18:17:59 +03:00
alfred-mk
6070792fe4 cleanup: remove extra space 2025-04-09 18:14:10 +03:00
alfred-mk
69ae494b2c update the order for the INCMP statement 2025-04-09 18:10:51 +03:00
alfred-mk
b89abf3487 update the reset flags in TestCheckBlockedStatus 2025-04-09 18:06:24 +03:00
alfred-mk
4ef8c47f8b update the reset flags in TestConfirmPinChange 2025-04-09 18:01:40 +03:00
alfred-mk
1076a9578e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-09 17:57:54 +03:00
alfred-mk
a27d44e561 updated the expected content for the alias in view profile 2025-04-09 17:52:58 +03:00
alfred-mk
35a2732fe2 updated the menu flow for the admin reset others PIN in test 2025-04-09 17:52:18 +03:00
alfred-mk
834f2ce629 remove code related to admins resetting a user's actual PIN 2025-04-09 17:39:41 +03:00
alfred-mk
26353bdf6e add a space 2025-04-09 17:34:24 +03:00
alfred-mk
1f6bf2bbed updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-09 16:59:48 +03:00
alfred-mk
0c1d9ab582 updated the description of the flag_incorrect_pin 2025-04-09 16:58:13 +03:00
alfred-mk
29d94bb2e5 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-09 16:57:22 +03:00
alfred-mk
067c496244 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-09 16:55:46 +03:00
alfred-mk
f8c258a3b4 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-09 16:49:04 +03:00
alfred-mk
aec96ce9ba move to the top node when one selects back 2025-04-09 15:19:23 +03:00
alfred-mk
71ef950fff use the confirm_self_pin_reset to confirm the new PIN 2025-04-09 15:12:51 +03:00
alfred-mk
477f3a307a use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-09 15:11:51 +03:00
alfred-mk
33c376c971 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-09 15:10:12 +03:00
Carlosokumu
79bf09f3d1 add logdb to menuhandler and associated write operations 2025-04-09 14:55:35 +03:00
Carlosokumu
f4804546d9 add log db struct with associated methods 2025-04-09 14:52:57 +03:00
Carlosokumu
3fff03a164 update visedriver dep 2025-04-09 14:50:28 +03:00
Carlosokumu
094866c129 add a logdb field to lhs and setter function 2025-04-09 14:49:41 +03:00
alfred-mk
514f6ae05b move back to the previous node if the admin user is not authorized 2025-04-08 16:26:21 +03:00
alfred-mk
8a6659a98b request the admin to authorize the PIN reset 2025-04-08 16:25:50 +03:00
alfred-mk
d094af9c51 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-08 16:25:11 +03:00
alfred-mk
f96f9c11e6 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-08 16:23:21 +03:00
Carlosokumu
1d8b0ef951 Merge branch 'master' into sms-upsell 2025-04-07 11:45:29 +03:00
Carlosokumu
fb2dc003b8 check recipient before sending an sms 2025-04-07 11:38:52 +03:00
alfred-mk
a11ca2a618 reset the flag_language_set and flag_account_created flags if the publicKey does not exist on the db
Some checks failed
release / docker (push) Has been cancelled
2025-04-04 12:05:04 +03:00
4268cc0589 build: logdebug mode
Some checks failed
release / docker (push) Has been cancelled
2025-04-03 15:45:41 +03:00
alfred-mk
ae0672c7da updated the vise version to pop the cache on a new session
Some checks failed
release / docker (push) Has been cancelled
2025-04-02 18:34:04 +03:00
alfred-mk
2c671bc0d4 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-02 18:29:04 +03:00
alfred-mk
c5673b339b added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-02 18:24:34 +03:00
Carlosokumu
58242c8d55 fix failing test: TestManageVouchers 2025-04-02 10:53:36 +03:00
Carlosokumu
cab90ed89a set and reset flag_api_error flag 2025-04-02 10:48:04 +03:00
Carlosokumu
73c3486400 catch api call failure when manage vouchers is called 2025-04-02 10:47:33 +03:00
Carlosokumu
3c84fb5ae7 Merge branch 'master' into route-api-errors 2025-04-02 10:38:47 +03:00
c3567313af Merge pull request 'manage vouchers in single function' (#42) from manage-vouchers-in-single-function into master
Reviewed-on: #42
2025-04-01 21:26:28 +02:00
f82b413e34 Merge branch 'master' into manage-vouchers-in-single-function 2025-04-01 21:26:16 +02:00
Carlosokumu
695bfed349 feat: send invites when a recipient
is not resolved
2025-04-01 16:30:08 +03:00
Carlosokumu
8bf48cb081 update sarafu-api dep 2025-04-01 16:25:59 +03:00
Carlosokumu
04880b58a8 fix failing test 2025-04-01 12:49:10 +03:00
Carlosokumu
0458ac9498 fix failing test 2025-04-01 12:38:57 +03:00
Carlosokumu
a7e8c184f5 add some spacing 2025-04-01 11:59:31 +03:00
Carlosokumu
3615348efd add swahili template 2025-04-01 11:57:59 +03:00
Carlosokumu
d0be79d817 set account creation failed flag 2025-04-01 11:30:00 +03:00
alfred-mk
ea0fc4491d removed debug related logs 2025-04-01 11:12:38 +03:00
Carlosokumu
7883063e53 feat: set and reset api call failure flags 2025-03-31 15:42:27 +03:00
Carlosokumu
f562ce8adf check for api call failure when setting the dafault voucher 2025-03-31 15:41:49 +03:00
Carlosokumu
cd2f4328a8 check for api call failure when checking transactions 2025-03-31 15:41:19 +03:00
Carlosokumu
95b9a6e486 catch api call failure when fetching voucher details 2025-03-28 16:09:53 +03:00
Carlosokumu
9674a04cbc add handler to reset api call failure flag,set flag when requesting an alias fails 2025-03-28 15:51:56 +03:00
Carlosokumu
6c46c097fb add explicit api call failure flag reset 2025-03-28 15:47:34 +03:00
Carlosokumu
c814c4ae5c register handler to reset api call failure flag 2025-03-28 15:46:57 +03:00
Carlosokumu
bbecec0310 catch api call error when requesting an alias 2025-03-28 15:46:21 +03:00
Carlosokumu
eaa89c29df Merge branch 'master' into route-api-errors 2025-03-28 15:22:40 +03:00
carlos
2634790118 Merge pull request 'use a different key for the suggested aliases' (#47) from fix-double-alias-request into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #47
2025-03-28 09:35:10 +01:00
Carlosokumu
272a7ac05f chore: remove extra colon 2025-03-28 11:32:24 +03:00
Carlosokumu
39c0d31995 remove verbose logs 2025-03-28 11:26:32 +03:00
Carlosokumu
18acb53ead add alias logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-28 11:08:50 +03:00
Carlosokumu
43d91f84f6 use a different key for the suggested aliases 2025-03-28 10:49:31 +03:00
Carlosokumu
e832f46d22 return to top on retry 2025-03-26 14:40:54 +03:00
Carlosokumu
039117f40e add api call failure catch 2025-03-26 14:40:32 +03:00
Carlosokumu
3532f72fbd remove unneccessary catch 2025-03-26 14:39:37 +03:00
Carlosokumu
04c7e20457 set api call error flag to failing api calls 2025-03-26 14:38:47 +03:00
alfred-mk
0914217769 increase the size limit for the manage_vouchers 2025-03-26 14:33:23 +03:00
alfred-mk
ea117b7222 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:28:43 +03:00
alfred-mk
39e1c84a45 added TestManageVouchers for ManageVouchers 2025-03-26 14:27:17 +03:00
alfred-mk
20ee4dfb24 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:26:31 +03:00
0791eb1f11 ci/cd: build with log warn only
Some checks failed
release / docker (push) Has been cancelled
2025-03-25 09:52:37 +03:00
alfred-mk
8ebd2bbbfa remove alias updates from TestUpdateAllProfileItems
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 20:06:07 +03:00
alfred-mk
06c534cbb1 remove the subprefix db from TestViewVoucher 2025-03-24 20:03:20 +03:00
alfred-mk
b8d53f82bb remove the subprefix db from TestGetVoucherList 2025-03-24 20:01:44 +03:00
alfred-mk
71c01e00cd remove commented out code 2025-03-24 19:58:43 +03:00
alfred-mk
419716a2b4 remove the subprefix db from TestCheckVouchers 2025-03-24 19:57:08 +03:00
alfred-mk
54b2088842 Pass correct arguments in the TestGetVoucherData 2025-03-24 19:53:02 +03:00
alfred-mk
b2208359d6 Add missing param to the GetVoucherData 2025-03-24 19:46:58 +03:00
alfred-mk
0828b1eb10 Increase the limit for the max_amount output 2025-03-24 19:46:58 +03:00
carlos
c22f9edeca Merge pull request 'fix-multiple-alias-requests' (#38) from fix-multiple-alias-requests into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #38
2025-03-24 15:47:26 +01:00
Carlosokumu
c81b17994a remove redundant cast on sanitized input 2025-03-24 16:03:30 +03:00
Carlosokumu
64b42b92ec Merge branch 'master' into fix-multiple-alias-requests 2025-03-24 16:00:20 +03:00
Carlosokumu
493f64157b sanitize alias hint before request 2025-03-24 15:59:13 +03:00
Carlosokumu
f6c9d54a65 register check-account_created handler
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:39:03 +03:00
Carlosokumu
74c82de472 add check for if public key exists,then explicitly set flag_account_created
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:29:40 +03:00
Carlosokumu
ddb8c6e748 add lowercase balance text translation 2025-03-22 18:39:05 +03:00
Carlosokumu
87ebd0029b chore: show default value when profile info is not set 2025-03-22 18:38:35 +03:00
Carlosokumu
b941cf2562 chore: match profile text prompt 2025-03-22 18:37:27 +03:00
Carlosokumu
1c8bda5ded fix(alias): remove alias requests made when a profile item is edited,show a default value when an alias is not set 2025-03-22 09:49:19 +03:00
alfred-mk
30cb800450 Added log lines for voucherlist
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:58:30 +03:00
alfred-mk
680a1e9681 Use userstore for the voucher data instead of subprefixdb
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:46:13 +03:00
Carlosokumu
b327b569fb fix failing test 2025-03-21 09:05:51 +03:00
alfred-mk
445ca0d0ff Add a default alias to remove bug in retrieving the data
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 22:34:04 +03:00
alfred-mk
e681c9cfca Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:23:36 +03:00
alfred-mk
d504571014 Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:07:02 +03:00
alfred-mk
3b16e25ebd Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:54:06 +03:00
alfred-mk
5f37856927 Added activeSym logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:35:06 +03:00
Carlosokumu
e564f1328b add fetched vouchers log
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 13:48:34 +03:00
374f79388c ci/cd: remove ssh binary from Docker builds
Some checks failed
release / docker (push) Has been cancelled
2025-03-18 17:48:55 +03:00
lash
30644d3535 Merge branch 'lash/more-edbug' 2025-03-15 03:12:05 +00:00
lash
e5e857e3cb Upgrade deps 2025-03-15 03:02:25 +00:00
Carlosokumu
1af826e87f dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 12:41:16 +03:00
Carlosokumu
38ef3b623e dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 11:53:47 +03:00
Carlosokumu
f7e7f7bd1c add for check back,add logs for the alias 2025-03-10 11:51:02 +03:00
Carlosokumu
bd0e7822ed dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 16:13:23 +03:00
Carlosokumu
4dba5f2ab5 dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 09:48:30 +03:00
144398e18b Merge pull request 'ens' (#32) from ens into master
Reviewed-on: #32
Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
2025-03-07 06:00:17 +01:00
119 changed files with 2617 additions and 1019 deletions

View File

@@ -21,3 +21,11 @@ LANGUAGES=eng, swa
#Alias search domains
ALIAS_SEARCH_DOMAINS=sarafu.local, sarafu.eth
#Pool swap
DEFAULT_POOL_NAME="Kenya ROLA Pool"
DEFAULT_POOL_SYMBOL=ROLA
DEFAULT_POOL_CONTRACT_ADDRESS=0x48a953cA5cf5298bc6f6Af3C608351f537AAcb9e
DEFAULT_LIMITER_ADDRESS=
DEFAULT_VOUCHER_REGISTRY=
INCLUDE_STABLES_PARAM=false

View File

@@ -21,8 +21,7 @@ RUN make VISE_PATH=/build/go-vise -B
WORKDIR /build/sarafu-vise
RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM"
RUN go mod download
RUN go build -tags logtrace,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go
RUN go build -tags logtrace,online -o sarafu-ssh -ldflags="-X main.build=${BUILD} -s -w" cmd/ssh/main.go
RUN go build -tags logdebug,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go
FROM debian:bookworm-slim
@@ -37,7 +36,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /service
COPY --from=build /build/sarafu-vise/sarafu-at .
COPY --from=build /build/sarafu-vise/sarafu-ssh .
COPY --from=build /build/sarafu-vise/LICENSE .
COPY --from=build /build/sarafu-vise/README.md .
COPY --from=build /build/sarafu-vise/services ./services
@@ -45,6 +43,5 @@ COPY --from=build /build/sarafu-vise/.env.example .
RUN mv .env.example .env
EXPOSE 7123
EXPOSE 7122
CMD ["./sarafu-at"]

View File

@@ -44,6 +44,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -55,6 +56,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -100,6 +102,11 @@ func main() {
fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err)
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
@@ -113,6 +120,7 @@ func main() {
os.Exit(1)
}
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, "setdatastore: %v\n", err)
os.Exit(1)

View File

@@ -56,6 +56,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -69,6 +70,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -120,6 +122,12 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
//defer userdataStore.Close(ctx)
dbResource, ok := rs.(*resource.DbResource)
@@ -129,6 +137,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)

View File

@@ -43,6 +43,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string")
@@ -55,6 +56,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -103,6 +105,12 @@ func main() {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
os.Exit(1)
@@ -110,6 +118,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())

View File

@@ -36,6 +36,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -46,6 +47,7 @@ func main() {
flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -110,6 +112,12 @@ func main() {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdatastore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
fmt.Fprintf(os.Stderr, "get dbresource error: %v\n", err)
@@ -118,6 +126,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdatastore)
lhs.SetLogDb(&logdb)
lhs.SetPersister(pe)
if err != nil {
fmt.Fprintf(os.Stderr, "localhandler service error: %v\n", err)

View File

@@ -25,7 +25,7 @@ const (
defaultSSHHost string = "127.0.0.1"
defaultSSHPort uint = 7122
defaultHTTPHost string = "127.0.0.1"
defaultHTTPPort uint = 7123
defaultHTTPPort uint = 7123
defaultDomain = "sarafu.local"
)
@@ -52,7 +52,6 @@ func SearchDomains() []string {
return ParsedDomains
}
func Language() string {
return viseconfig.DefaultLanguage
}
@@ -76,3 +75,15 @@ func PortSSH() uint {
func ATEndpoint() string {
return env.GetEnv("AT_ENDPOINT", "/")
}
func DefaultPoolAddress() string {
return env.GetEnv("DEFAULT_POOL_CONTRACT_ADDRESS", "")
}
func DefaultPoolName() string {
return env.GetEnv("DEFAULT_POOL_NAME", "")
}
func DefaultPoolSymbol() string {
return env.GetEnv("DEFAULT_POOL_SYMBOL", "")
}

View File

@@ -15,7 +15,7 @@ import (
const (
changeHeadSrc = `LOAD reset_account_authorized 0
LOAD reset_incorrect 0
LOAD reset_incorrect_pin 0
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0
`

36
go.mod
View File

@@ -3,14 +3,15 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise
go 1.23.4
require (
git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244
git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250624090744-339ba854c997
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
github.com/alecthomas/assert/v2 v2.2.2
github.com/gofrs/uuid v4.4.0+incompatible
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta
github.com/grassrootseconomics/ethutils v1.3.1
github.com/grassrootseconomics/ussd-data-service v1.6.0-beta
github.com/jackc/pgx/v5 v5.7.1
github.com/peteole/testdata-loader v0.3.0
github.com/stretchr/testify v1.9.0
@@ -19,24 +20,49 @@ require (
)
require (
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/alecthomas/participle/v2 v2.0.0 // indirect
github.com/alecthomas/repr v0.2.0 // indirect
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c // indirect
github.com/bits-and-blooms/bitset v1.14.3 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect
github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
github.com/ethereum/go-ethereum v1.14.9 // indirect
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/grassrootseconomics/eth-custodial v1.3.0-beta // indirect
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/holiman/uint256 v1.3.1 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/joho/godotenv v1.5.1 // indirect
github.com/lmittmann/w3 v0.17.1 // indirect
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/supranational/blst v0.3.11 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/x448/float16 v0.8.4 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
)

163
go.sum
View File

@@ -1,13 +1,29 @@
git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac h1:f/E0ZTclVfMEnD/3Alrzzbg+dOm138zGydV42jT0JPw=
git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 h1:cbBpm9uNJak58MpFpNXJuvgCmz+A8kquXr9har4expg=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w=
git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66 h1:hmtb2Q3lHxq+SXqG+Gn43pKhTRYx+sw5j1LpgBfXN1o=
git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623063234-c1797e7a32b5 h1:VnRe01kHkZUBK/QjE7iV6gElSqSwQnAkWV3yCHtuYrI=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623063234-c1797e7a32b5/go.mod h1:H97hR+VOnZvR5BiGVb0ScCPwH/IoKBOlKM+yrQNVpq0=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623070026-d945964b0b46 h1:0+XkSRe7XSHa9WHXKpGPuC0myDszjchr4syH006lQ28=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623070026-d945964b0b46/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623075057-7b42d509e6d4 h1:W+8CC7x5eCPylkGy2TEoOpfJuiIlqzEzyYTzCLlY/u8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250623075057-7b42d509e6d4/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250624074830-5aa032400c12 h1:vD8biQmN36eouuE+TdxgXQjKisRf5cTGu/tMPv3afs0=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250624074830-5aa032400c12/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250624090744-339ba854c997 h1:8bCKyYoV4YiVBvCZlRclc3aQlBYpWhgtM35mvniDFD8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250624090744-339ba854c997/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=
github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g=
@@ -16,21 +32,91 @@ github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk
github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bits-and-blooms/bitset v1.14.3 h1:Gd2c8lSNf9pKXom5JtD7AaKO8o7fGQ2LtFj1436qilA=
github.com/bits-and-blooms/bitset v1.14.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA=
github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
github.com/ethereum/go-ethereum v1.14.9 h1:J7iwXDrtUyE9FUjUYbd4c9tyzwMh6dTJsKzo9i6SrwA=
github.com/ethereum/go-ethereum v1.14.9/go.mod h1:QeW+MtTpRdBEm2pUFoonByee8zfHv7kGp0wK0odvU1I=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grassrootseconomics/eth-custodial v1.3.0-beta h1:twrMBhl89GqDUL9PlkzQxMP/6OST1BByrNDj+rqXDmU=
github.com/grassrootseconomics/eth-custodial v1.3.0-beta/go.mod h1:7uhRcdnJplX4t6GKCEFkbeDhhjlcaGJeJqevbcvGLZo=
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta h1:fn1gwbWIwHVEBtUC2zi5OqTlfI/5gU1SMk0fgGixIXk=
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta/go.mod h1:omfI0QtUwIdpu9gMcUqLMCG8O1XWjqJGBx1qUMiGWC0=
github.com/grassrootseconomics/ethutils v1.3.1 h1:LlQO90HjJkl7ejC8fv6jP7RJUrAm1j4VMMCYfsoIrhU=
github.com/grassrootseconomics/ethutils v1.3.1/go.mod h1:Wuv1VEZrkLIXqTSEYI3Nh9HG/ZHOUQ+U+xvWJ8QtjgQ=
github.com/grassrootseconomics/ussd-data-service v1.5.0-beta h1:BSSQL/yPEvTVku9ja/ENZyZdwZkEaiTzzOUfg72bTy4=
github.com/grassrootseconomics/ussd-data-service v1.5.0-beta/go.mod h1:9sGnorpKaK76FmOGXoh/xv7x5siSFNYdXxQo9BKW4DI=
github.com/grassrootseconomics/ussd-data-service v1.6.0-beta h1:pY6zns6ifXyClRxP+JJaWrged3oRE7tTS2xaftF9clA=
github.com/grassrootseconomics/ussd-data-service v1.6.0-beta/go.mod h1:9sGnorpKaK76FmOGXoh/xv7x5siSFNYdXxQo9BKW4DI=
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 h1:U4kkNYryi/qfbBF8gh7Vsbuz+cVmhf5kt6pE9bYYyLo=
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4/go.mod h1:zpZDgZFzeq9s0MIeB1P50NIEWDFFHSFBohI/NbaTD/Y=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs=
github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
@@ -41,21 +127,52 @@ github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/lmittmann/w3 v0.17.1 h1:zdXIimmNmYfqOFur+Jqc9Yqwtq6jwnsQufbTOnSAtW4=
github.com/lmittmann/w3 v0.17.1/go.mod h1:WVUGMbL83WYBu4Sge3SVlW3qIG4VaHe+S8+UUnwz9Eg=
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a h1:0Q3H0YXzMHiciXtRcM+j0jiCe8WKPQHoRgQiRTnfcLY=
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a/go.mod h1:CdTTBOYzS5E4mWS1N8NWP6AHI19MP0A2B18n3hLzRMk=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/pashagolub/pgxmock/v4 v4.3.0 h1:DqT7fk0OCK6H0GvqtcMsLpv8cIwWqdxWgfZNLeHCb/s=
github.com/pashagolub/pgxmock/v4 v4.3.0/go.mod h1:9VoVHXwS3XR/yPtKGzwQvwZX1kzGB9sM8SviDcHDa3A=
github.com/peteole/testdata-loader v0.3.0 h1:8jckE9KcyNHgyv/VPoaljvKZE0Rqr8+dPVYH6rfNr9I=
github.com/peteole/testdata-loader v0.3.0/go.mod h1:Mt0ZbRtb56u8SLJpNP+BnQbENljMorYBpqlvt3cS83U=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
@@ -63,23 +180,45 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/leonelquinteros/gotext.v1 v1.3.1 h1:8d9/fdTG0kn/B7NNGV1BsEyvektXFAbkMsTZS2sFSCc=
gopkg.in/leonelquinteros/gotext.v1 v1.3.1/go.mod h1:X1WlGDeAFIYsW6GjgMm4VwUwZ2XjI7Zan2InxSUQWrU=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -49,9 +49,8 @@ func (eu *EventsUpdater) updateToken(ctx context.Context, identity identity.Iden
// set default token to given symbol.
func (eu *EventsUpdater) updateDefaultToken(ctx context.Context, identity identity.Identity, userStore *store.UserDataStore, activeSym string) error {
pfxDb := toPrefixDb(userStore, identity.SessionId)
// TODO: the activeSym input should instead be newline separated list?
tokenData, err := store.GetVoucherData(ctx, pfxDb, activeSym)
tokenData, err := store.GetVoucherData(ctx, userStore, identity.SessionId, activeSym)
if err != nil {
return err
}

View File

@@ -27,6 +27,7 @@ type LocalHandlerService struct {
DbRs *resource.DbResource
Pe *persist.Persister
UserdataStore *db.Db
LogDb *db.Db
Cfg engine.Config
Rs resource.Resource
first resource.EntryFunc
@@ -57,12 +58,16 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) {
ls.UserdataStore = db
}
func (ls *LocalHandlerService) SetLogDb(db *db.Db) {
ls.LogDb = db
}
func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) (*application.MenuHandlers, error) {
replaceSeparatorFunc := func(input string) string {
return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator)
}
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, accountService, replaceSeparatorFunc)
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, *ls.LogDb, accountService, replaceSeparatorFunc)
if err != nil {
return nil, err
}
@@ -86,7 +91,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("get_recipient", appHandlers.GetRecipient)
ls.DbRs.AddLocalFunc("get_sender", appHandlers.GetSender)
ls.DbRs.AddLocalFunc("get_amount", appHandlers.GetAmount)
ls.DbRs.AddLocalFunc("reset_incorrect", appHandlers.ResetIncorrectPin)
ls.DbRs.AddLocalFunc("reset_incorrect_pin", appHandlers.ResetIncorrectPin)
ls.DbRs.AddLocalFunc("save_firstname", appHandlers.SaveFirstname)
ls.DbRs.AddLocalFunc("save_familyname", appHandlers.SaveFamilyname)
ls.DbRs.AddLocalFunc("save_gender", appHandlers.SaveGender)
@@ -99,23 +104,22 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("verify_yob", appHandlers.VerifyYob)
ls.DbRs.AddLocalFunc("reset_incorrect_date_format", appHandlers.ResetIncorrectYob)
ls.DbRs.AddLocalFunc("initiate_transaction", appHandlers.InitiateTransaction)
ls.DbRs.AddLocalFunc("verify_new_pin", appHandlers.VerifyNewPin)
ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange)
ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp)
ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance)
ls.DbRs.AddLocalFunc("set_default_voucher", appHandlers.SetDefaultVoucher)
ls.DbRs.AddLocalFunc("check_vouchers", appHandlers.CheckVouchers)
ls.DbRs.AddLocalFunc("manage_vouchers", appHandlers.ManageVouchers)
ls.DbRs.AddLocalFunc("get_vouchers", appHandlers.GetVoucherList)
ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher)
ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher)
ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails)
ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin)
ls.DbRs.AddLocalFunc("check_pin_mismatch", appHandlers.CheckBlockedNumPinMisMatch)
ls.DbRs.AddLocalFunc("get_default_pool", appHandlers.GetDefaultPool)
ls.DbRs.AddLocalFunc("get_pools", appHandlers.GetPools)
ls.DbRs.AddLocalFunc("view_pool", appHandlers.ViewPool)
ls.DbRs.AddLocalFunc("set_pool", appHandlers.SetPool)
ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber)
ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber)
ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber)
ls.DbRs.AddLocalFunc("reset_others_pin", appHandlers.ResetOthersPin)
ls.DbRs.AddLocalFunc("save_others_temporary_pin", appHandlers.SaveOthersTemporaryPin)
ls.DbRs.AddLocalFunc("get_current_profile_info", appHandlers.GetCurrentProfileInfo)
ls.DbRs.AddLocalFunc("check_transactions", appHandlers.CheckTransactions)
ls.DbRs.AddLocalFunc("get_transactions", appHandlers.GetTransactionsList)
@@ -128,7 +132,12 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias)
ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias)
ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias)
ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated)
ls.DbRs.AddLocalFunc("reset_api_call_failure", appHandlers.ResetApiCallFailure)
ls.DbRs.AddLocalFunc("swap_to_list", appHandlers.LoadSwapToList)
ls.DbRs.AddLocalFunc("swap_max_limit", appHandlers.SwapMaxLimit)
ls.DbRs.AddLocalFunc("swap_preview", appHandlers.SwapPreview)
ls.DbRs.AddLocalFunc("initiate_swap", appHandlers.InitiateSwap)
ls.first = appHandlers.Init
return appHandlers, nil

96
internal/sms/sms.go Normal file
View File

@@ -0,0 +1,96 @@
package sms
import (
"context"
"fmt"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/common/phone"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
logg = logging.NewVanilla().WithDomain("smsservice")
)
type SmsService struct {
Accountservice remote.AccountService
Userdatastore store.UserDataStore
}
// SendUpsellSMS will send an invitation SMS to an unregistered phone number
func (smsservice *SmsService) SendUpsellSMS(ctx context.Context, inviterPhone, inviteePhone string) error {
if !phone.IsValidPhoneNumber(inviterPhone) {
return fmt.Errorf("invalid inviter phone number %v", inviterPhone)
}
if !phone.IsValidPhoneNumber(inviteePhone) {
return fmt.Errorf("Invalid invitee phone number %v", inviteePhone)
}
_, err := smsservice.Accountservice.SendUpsellSMS(ctx, inviterPhone, inviteePhone)
if err != nil {
return fmt.Errorf("Failed to send upsell sms: %v", err)
}
return nil
}
// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset.
func (smsService *SmsService) SendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error {
formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format admin phone number: %w", err)
}
formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format blocked phone number: %w", err)
}
if !phone.IsValidPhoneNumber(formattedAdminPhone) {
return fmt.Errorf("invalid admin phone number")
}
if !phone.IsValidPhoneNumber(formattedBlockedPhone) {
return fmt.Errorf("invalid blocked phone number")
}
err = smsService.Accountservice.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone)
if err != nil {
return fmt.Errorf("failed to send pin reset sms: %v", err)
}
return nil
}
// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber.
func (smsService *SmsService) SendAddressSMS(ctx context.Context) error {
store := smsService.Userdatastore
sessionId, ok := ctx.Value("SessionId").(string)
if !ok {
return fmt.Errorf("missing session")
}
publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY)
if err != nil {
logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err)
return err
}
originPhone, err := phone.FormatPhoneNumber(sessionId)
if err != nil {
logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId)
return nil
}
if !phone.IsValidPhoneNumber(originPhone) {
logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone)
return fmt.Errorf("invalid origin phone number")
}
err = smsService.Accountservice.SendAddressSMS(ctx, string(publicKey), originPhone)
if err != nil {
logg.DebugCtxf(ctx, "Failed to send address sms", "error", err)
return fmt.Errorf("Failed to send address sms: %v", err)
}
return nil
}

View File

@@ -202,23 +202,7 @@
},
{
"input": "0700000000",
"expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "11111",
"expectedContent": "The PIN you have entered is invalid.Please try a 4 digit number instead.\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "1111",
"expectedContent": "Please confirm new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "1111",
"expectedContent": "Please enter your PIN:"
"expectedContent": "{secondary_session_id} will get a PIN reset request.\nPlease enter your PIN to confirm:\n0:Back\n9:Quit"
},
{
"input": "1234",
@@ -612,7 +596,7 @@
},
{
"input": "1234",
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit"
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit"
},
{
"input": "0",

View File

@@ -11,7 +11,7 @@
},
{
"input": "1",
"expectedContent": "Do you agree to terms and conditions?\nhttps://grassecon.org/pages/terms-and-conditions\n\n1:Yes\n2:No"
"expectedContent": "Do you agree to terms and conditions?\nhttps://grassecon.org/tos\n\n1:Yes\n2:No"
},
{
"input": "1",
@@ -31,7 +31,7 @@
},
{
"input": "1234",
"expectedContent": "Your account is being created...Thank you for using Sarafu. Goodbye!"
"expectedContent": "Your account is being created. Thank you for using Sarafu. Goodbye!"
}
]
},
@@ -44,7 +44,7 @@
},
{
"input": "1",
"expectedContent": "Do you agree to terms and conditions?\nhttps://grassecon.org/pages/terms-and-conditions\n\n1:Yes\n2:No"
"expectedContent": "Do you agree to terms and conditions?\nhttps://grassecon.org/tos\n\n1:Yes\n2:No"
},
{
"input": "2",

View File

@@ -1 +1 @@
Your account is being created...
Your account is being created.

View File

@@ -1,5 +1,4 @@
LOAD check_identifier 0
RELOAD check_identifier
MAP check_identifier
MOUT back 0
MOUT quit 9

View File

@@ -1,12 +1,12 @@
LOAD reset_transaction_amount 0
LOAD max_amount 10
LOAD max_amount 40
RELOAD max_amount
MAP max_amount
MOUT back 0
HALT
LOAD validate_amount 64
RELOAD validate_amount
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
CATCH invalid_amount flag_invalid_amount 1
INCMP _ 0
LOAD get_recipient 0

View File

@@ -1 +1 @@
Failed to connect to the custodial service.Please try again.
Your request failed. Please try again later.

View File

@@ -1,5 +1,7 @@
LOAD reset_api_call_failure 6
RELOAD reset_api_call_failure
MOUT retry 1
MOUT quit 9
HALT
INCMP _ 1
INCMP ^ 1
INCMP quit 9

View File

@@ -0,0 +1 @@
Ombi lako halikufaulu. Tafadhali jaribu tena baadaye.

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} will get a PIN reset request.
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
MOUT quit 9
LOAD authorize_account 6
HALT
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
INCMP _ 0
INCMP quit 9
INCMP pin_reset_result *

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} atapokea ombi la kuweka upya PIN.
Tafadhali weka PIN yako kudhibitisha:

View File

@@ -1,5 +1,5 @@
LOAD reset_account_authorized 0
LOAD reset_incorrect 0
LOAD reset_incorrect_pin 0
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0
MOUT english 1

View File

@@ -1,5 +1,6 @@
LOAD check_transactions 0
RELOAD check_transactions
CATCH api_failure flag_api_call_error 1
CATCH no_transfers flag_no_transfers 1
LOAD authorize_account 6
MOUT back 0

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 6
LOAD reset_incorrect_pin 6
LOAD fetch_community_balance 0
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
MAP fetch_community_balance
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0

View File

@@ -1,4 +1,7 @@
LOAD save_temporary_pin 6
MOUT back 0
HALT
INCMP _ 0
LOAD verify_create_pin 8
RELOAD verify_create_pin
CATCH pin_mismatch flag_pin_mismatch 1
INCMP account_creation *

View File

@@ -8,5 +8,5 @@ HALT
INCMP _ 0
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH invalid_pin flag_invalid_pin 1
CATCH invalid_pin flag_invalid_pin 1
CATCH update_alias flag_allow_update 1

View File

@@ -1 +0,0 @@
Please confirm new PIN for: {{.retrieve_blocked_number}}

View File

@@ -1,14 +0,0 @@
CATCH incorrect_pin flag_incorrect_pin 1
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
CATCH invalid_others_pin flag_valid_pin 0
CATCH pin_reset_result flag_account_authorized 1
LOAD save_others_temporary_pin 6
RELOAD save_others_temporary_pin
MOUT back 0
HALT
INCMP _ 0
LOAD check_pin_mismatch 6
RELOAD check_pin_mismatch
CATCH others_pin_mismatch flag_pin_mismatch 1
INCMP pin_entry *

View File

@@ -1 +0,0 @@
Tafadhali thibitisha PIN mpya ya: {{.retrieve_blocked_number}}

View File

@@ -1,7 +1,7 @@
LOAD confirm_pin_change 0
MOUT back 0
HALT
INCMP _ 0
LOAD confirm_pin_change 0
RELOAD confirm_pin_change
CATCH pin_reset_mismatch flag_pin_mismatch 1
INCMP * pin_reset_success
CATCH pin_mismatch flag_pin_mismatch 1
INCMP pin_reset_success *

View File

@@ -2,8 +2,8 @@ LOAD create_account 0
CATCH account_creation_failed flag_account_creation_failed 1
MOUT exit 0
HALT
INCMP quit 0
LOAD save_temporary_pin 6
RELOAD save_temporary_pin
CATCH . flag_incorrect_pin 1
INCMP quit 0
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_create_pin *

View File

@@ -1,5 +0,0 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP confirm_create_pin 1
INCMP quit 9

View File

@@ -7,4 +7,4 @@ INCMP _ 0
LOAD validate_blocked_number 6
RELOAD validate_blocked_number
CATCH unregistered_number flag_unregistered_number 1
INCMP enter_others_new_pin *
INCMP authorize_reset_others_pin *

View File

@@ -1 +0,0 @@
Please enter new PIN for: {{.retrieve_blocked_number}}

View File

@@ -1,9 +0,0 @@
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
HALT
LOAD verify_new_pin 6
RELOAD verify_new_pin
INCMP _ 0
INCMP * confirm_others_new_pin

View File

@@ -1 +0,0 @@
Tafadhali weka PIN mpya ya: {{.retrieve_blocked_number}}

View File

@@ -1 +1 @@
Incorrect PIN. You have: {{.reset_incorrect}} remaining attempt(s).
Incorrect PIN. You have: {{.reset_incorrect_pin}} remaining attempt(s).

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 0
RELOAD reset_incorrect
MAP reset_incorrect
LOAD reset_incorrect_pin 0
RELOAD reset_incorrect_pin
MAP reset_incorrect_pin
CATCH blocked_account flag_account_blocked 1
MOUT retry 1
MOUT quit 9

View File

@@ -1 +1 @@
PIN ulioeka sio sahihi, una majaribio: {{.reset_incorrect}} yaliyobaki
PIN ulioeka sio sahihi, una majaribio: {{.reset_incorrect_pin}} yaliyobaki

View File

@@ -1 +0,0 @@
The PIN you have entered is invalid.Please try a 4 digit number instead.

View File

@@ -1,5 +0,0 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP enter_others_new_pin 1
INCMP quit 9

View File

@@ -1 +1 @@
The PIN you entered is invalid.The PIN must be a 4 digit number.
The PIN you entered is invalid. The PIN must be a 4 digit number.

View File

@@ -30,3 +30,15 @@ msgstr "Salio la Kikundi: 0.00"
msgid "Symbol: %s\nBalance: %s"
msgstr "Sarafu: %s\nSalio: %s"
msgid "Your request has been sent. You will receive an SMS when your %s %s has been swapped for %s."
msgstr "Ombi lako limetumwa. Utapokea SMS wakati %s %s yako itakapobadilishwa kuwa %s."
msgid "%s balance: %s\n"
msgstr "%s salio: %s\n"
msgid "%s is not in %s. Please update your voucher and try again."
msgstr "%s haipo kwenye %s. Tafadhali badilisha sarafu yako na ujaribu tena."
msgid "Name: %s\nSymbol: %s"
msgstr "Jina: %s\nSarafu: %s"

View File

@@ -0,0 +1 @@
Available amount {{.swap_max_limit}} is too low, please try again:

View File

@@ -1,6 +1,6 @@
MAP swap_max_limit
MOUT retry 1
MOUT quit 9
HALT
INCMP _ 1
INCMP quit 9
INCMP . *

View File

@@ -0,0 +1 @@
Kiasi kinachopatikana {{.swap_max_limit}} ni cha chini sana, tafadhali jaribu tena:

View File

@@ -1,22 +1,22 @@
LOAD clear_temporary_value 2
RELOAD clear_temporary_value
LOAD set_default_voucher 8
RELOAD set_default_voucher
LOAD check_vouchers 10
RELOAD check_vouchers
LOAD manage_vouchers 160
RELOAD manage_vouchers
CATCH api_failure flag_api_call_error 1
LOAD check_balance 128
RELOAD check_balance
CATCH api_failure flag_api_call_error 1
MAP check_balance
MOUT send 1
MOUT vouchers 2
MOUT account 3
MOUT help 4
MOUT swap 2
MOUT vouchers 3
MOUT account 4
MOUT help 5
MOUT quit 9
HALT
INCMP send 1
INCMP my_vouchers 2
INCMP my_account 3
INCMP help 4
INCMP swap_to_list 2
INCMP my_vouchers 3
INCMP my_account 4
INCMP help 5
INCMP quit 9
INCMP . *

View File

@@ -0,0 +1 @@
{{.swap_to_list}}

View File

@@ -0,0 +1,6 @@
MAP swap_to_list
MOUT back 0
MOUT quit 9
HALT
INCMP ^ 0
INCMP quit 9

View File

@@ -0,0 +1 @@
{{.swap_to_list}}

View File

@@ -9,7 +9,7 @@ MOUT my_address 6
MOUT my_account_alias 7
MOUT back 0
HALT
INCMP main 0
INCMP ^ 0
INCMP edit_profile 1
INCMP change_language 2
INCMP balances 3

View File

@@ -1,2 +1,2 @@
Current alias: {{.get_current_profile_info}}
Edit my alias:
Enter your preferred alias:

View File

@@ -5,4 +5,5 @@ HALT
INCMP _ 0
LOAD request_custom_alias 0
RELOAD request_custom_alias
INCMP confirm_new_alias *
CATCH api_failure flag_api_call_error 1
INCMP confirm_new_alias *

View File

@@ -1,2 +1,2 @@
Lakabu ya sasa: {{.get_current_profile_info}}
Badilisha Lakabu yangu:
Weka lakabu unalopendelea:

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 6
LOAD reset_incorrect_pin 6
LOAD check_balance 0
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
MAP check_balance
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0

View File

@@ -2,8 +2,11 @@ LOAD reset_account_authorized 16
RELOAD reset_account_authorized
MOUT select_voucher 1
MOUT voucher_details 2
MOUT select_pool 3
MOUT back 0
HALT
INCMP _ 0
INCMP select_voucher 1
INCMP voucher_details 2
INCMP select_pool 3
INCMP . *

View File

@@ -2,6 +2,5 @@ MOUT back 0
HALT
INCMP _ 0
RELOAD save_temporary_pin
RELOAD verify_new_pin
CATCH invalid_pin flag_valid_pin 0
INCMP * confirm_pin_change
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_pin_change *

View File

@@ -1,8 +1,8 @@
RELOAD reset_incorrect
RELOAD reset_incorrect_pin
MOUT back 0
HALT
INCMP _ 0
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH invalid_pin flag_invalid_pin 1
CATCH invalid_pin flag_invalid_pin 1
INCMP new_pin *

View File

@@ -1 +0,0 @@
The PIN you have entered is not a match

View File

@@ -1 +0,0 @@
PIN uliyoweka hailingani.Jaribu tena.

View File

@@ -1,9 +1,8 @@
LOAD set_back 6
LOAD authorize_account 16
LOAD reset_allow_update 4
LOAD verify_new_pin 2
LOAD save_temporary_pin 1
LOAD reset_incorrect 0
LOAD reset_incorrect_pin 0
LOAD reset_invalid_pin 6
MOUT change_pin 1
MOUT reset_pin 2

View File

@@ -1 +0,0 @@
The PIN is not a match. Try again

View File

@@ -1 +0,0 @@
PIN uliyoweka hailingani.Jaribu tena.

View File

@@ -1,3 +1,4 @@
CATCH _ flag_account_authorized 0
LOAD retrieve_blocked_number 0
MAP retrieve_blocked_number
LOAD reset_others_pin 6
@@ -5,4 +6,4 @@ MOUT back 0
MOUT quit 9
HALT
INCMP ^ 0
INCMP quit 9
INCMP quit 9

View File

@@ -1,6 +1,6 @@
MOUT back 0
MOUT quit 9
HALT
INCMP main 0
INCMP ^ 0
INCMP quit 9
INCMP . *

View File

@@ -0,0 +1 @@
Success! {{.set_pool}} is now your active pool.

View File

@@ -0,0 +1,10 @@
LOAD reset_incorrect_pin 6
CATCH _ flag_account_authorized 0
LOAD set_pool 20
MAP set_pool
MOUT back 0
MOUT quit 9
HALT
INCMP ^ 0
INCMP quit 9
INCMP ^ *

View File

@@ -0,0 +1 @@
Hongera! {{.set_pool}} ni bwawa la Sarafu linalotumika sasa.

View File

@@ -9,7 +9,7 @@ flag,flag_account_authorized,15,this is set to allow a user access guarded nodes
flag,flag_invalid_recipient,16,this is set when the transaction recipient is invalid
flag,flag_invalid_recipient_with_invite,17,this is set when the transaction recipient is valid but not on the platform
flag,flag_invalid_amount,18,this is set when the given transaction amount is invalid
flag,flag_incorrect_pin,19,this is set when the provided PIN is invalid or does not match the current account's PIN
flag,flag_incorrect_pin,19,this is set when the provided PIN does not match the current account's PIN
flag,flag_valid_pin,20,this is set when the given PIN is valid
flag,flag_allow_update,21,this is set to allow a user to update their profile data
flag,flag_single_edit,22,this is set to allow a user to edit a single profile item such as year of birth
@@ -31,3 +31,7 @@ flag,flag_back_set,37,this is set when it is a back navigation
flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded
flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits)
flag,flag_alias_set,40,this is set when an account alias has been assigned to a user
flag,flag_account_pin_reset,41,this is set on an account when an admin triggers a PIN reset for themflag,flag_incorrect_pool,39,this is set when the user selects an invalid pool
flag,flag_incorrect_pool,42,this is set when the user selects an invalid pool
flag,flag_low_swap_amount,43,this is set when the swap max limit is less than 0.1
1 flag flag_language_set 8 checks whether the user has set their prefered language
9 flag flag_invalid_recipient 16 this is set when the transaction recipient is invalid
10 flag flag_invalid_recipient_with_invite 17 this is set when the transaction recipient is valid but not on the platform
11 flag flag_invalid_amount 18 this is set when the given transaction amount is invalid
12 flag flag_incorrect_pin 19 this is set when the provided PIN is invalid or does not match the current account's PIN this is set when the provided PIN does not match the current account's PIN
13 flag flag_valid_pin 20 this is set when the given PIN is valid
14 flag flag_allow_update 21 this is set to allow a user to update their profile data
15 flag flag_single_edit 22 this is set to allow a user to edit a single profile item such as year of birth
31 flag flag_account_blocked 38 this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded
32 flag flag_invalid_pin 39 this is set when the given PIN is invalid(is less than or more than 4 digits)
33 flag flag_alias_set 40 this is set when an account alias has been assigned to a user
34 flag flag_account_pin_reset 41 this is set on an account when an admin triggers a PIN reset for themflag
35 flag flag_incorrect_pool 42 this is set when the user selects an invalid pool
36 flag flag_low_swap_amount 43 this is set when the swap max limit is less than 0.1
37

View File

@@ -1,12 +1,15 @@
LOAD check_blocked_status 1
RELOAD check_blocked_status
LOAD check_account_created 2
RELOAD check_account_created
CATCH self_reset_pin flag_account_pin_reset 1
CATCH blocked_account flag_account_blocked 1
CATCH select_language flag_language_set 0
CATCH terms flag_account_created 0
CATCH create_pin flag_pin_set 0
LOAD check_account_status 0
RELOAD check_account_status
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
CATCH account_pending flag_account_pending 1
CATCH create_pin flag_pin_set 0
CATCH main flag_account_success 1
HALT

View File

@@ -0,0 +1,3 @@
Enter number or symbol to set the default pool:
Current: {{.get_default_pool}}
{{.get_pools}}

View File

@@ -0,0 +1,20 @@
CATCH no_voucher flag_no_active_voucher 1
LOAD get_pools 0
MAP get_pools
LOAD get_default_pool 20
RELOAD get_default_pool
MAP get_default_pool
MOUT back 0
MOUT quit 99
MNEXT next 88
MPREV prev 98
HALT
INCMP > 88
INCMP < 98
INCMP _ 0
INCMP quit 99
LOAD view_pool 80
RELOAD view_pool
CATCH api_failure flag_api_call_error 1
CATCH . flag_incorrect_pool 1
INCMP view_pool *

View File

@@ -0,0 +1 @@
Select pool

View File

@@ -0,0 +1 @@
Chagua Bwawa

View File

@@ -0,0 +1,3 @@
Chagua nambari au ishara kuweka bwawa la sarafu:
La sasa: {{.get_default_pool}}
{{.get_pools}}

View File

@@ -3,14 +3,14 @@ LOAD get_vouchers 0
MAP get_vouchers
MOUT back 0
MOUT quit 99
MNEXT next 11
MPREV prev 22
MNEXT next 88
MPREV prev 98
HALT
INCMP > 88
INCMP < 98
INCMP _ 0
INCMP quit 99
LOAD view_voucher 80
RELOAD view_voucher
CATCH . flag_incorrect_voucher 1
INCMP _ 0
INCMP quit 99
INCMP > 11
INCMP < 22
INCMP view_voucher *

View File

@@ -0,0 +1,2 @@
A PIN reset has been done on your account.
Please enter a new four number PIN:

View File

@@ -0,0 +1,6 @@
LOAD reset_invalid_pin 6
HALT
LOAD save_temporary_pin 1
RELOAD save_temporary_pin
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_pin_change *

View File

@@ -0,0 +1,2 @@
Uwekaji upya wa PIN umefanyika kwenye akaunti yako.
Tafadhali weka PIN mpya ya nambari nne:

View File

@@ -5,6 +5,7 @@ MOUT back 0
HALT
LOAD validate_recipient 50
RELOAD validate_recipient
CATCH api_failure flag_api_call_error 1
CATCH invalid_recipient flag_invalid_recipient 1
CATCH invite_recipient flag_invalid_recipient_with_invite 1
INCMP _ 0

View File

@@ -0,0 +1,4 @@
LOAD reset_incorrect_pin 6
CATCH _ flag_account_authorized 0
LOAD initiate_swap 0
HALT

View File

@@ -0,0 +1 @@
{{.swap_max_limit}}

View File

@@ -0,0 +1,5 @@
MAP swap_max_limit
MOUT back 0
HALT
INCMP _ 0
INCMP swap_preview *

View File

@@ -0,0 +1 @@
{{.swap_max_limit}}

View File

@@ -0,0 +1 @@
Swap

View File

@@ -0,0 +1,3 @@
{{.swap_preview}}
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD swap_preview 0
MAP swap_preview
CATCH api_failure flag_api_call_error 1
MOUT back 0
MOUT quit 9
LOAD authorize_account 6
HALT
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
INCMP _ 0
INCMP quit 9
INCMP swap_initiated *

View File

@@ -0,0 +1,3 @@
{{.swap_preview}}
Tafadhali weka PIN yako kudhibitisha:

View File

@@ -0,0 +1,2 @@
Select number or symbol to swap TO:
{{.swap_to_list}}

View File

@@ -0,0 +1,14 @@
CATCH no_voucher flag_no_active_voucher 1
LOAD swap_to_list 0
RELOAD swap_to_list
MAP swap_to_list
CATCH missing_voucher flag_incorrect_voucher 1
MOUT back 0
HALT
LOAD swap_max_limit 64
RELOAD swap_max_limit
CATCH api_failure flag_api_call_error 1
CATCH . flag_incorrect_voucher 1
CATCH low_swap_amount flag_low_swap_amount 1
INCMP _ 0
INCMP swap_limit *

View File

@@ -0,0 +1,2 @@
Chagua nambari au ishara ya sarafu kubadilisha KWENDA:
{{.swap_to_list}}

View File

@@ -1,2 +1,2 @@
Do you agree to terms and conditions?
https://grassecon.org/pages/terms-and-conditions
https://grassecon.org/tos

Some files were not shown because too many files have changed in this diff Show More