diff --git a/dev/api.go b/dev/api.go index 28e608c..1a63e33 100644 --- a/dev/api.go +++ b/dev/api.go @@ -929,3 +929,10 @@ func (das *DevAccountService) MpesaTriggerOnramp(ctx context.Context, address, p TransactionCode: "ae6fb33b-4653-4f38-a3b6-85dfea7a1e99", }, nil } + +func (das *DevAccountService) GetMpesaOnrampRates(ctx context.Context) (*models.MpesaOnrampRatesResponse, error) { + return &models.MpesaOnrampRatesResponse{ + Buy: 128.15, + Sell: 130.06, + }, nil +} diff --git a/models/mpesa_onramp_response.go b/models/mpesa_onramp_response.go index b6155af..c028f64 100644 --- a/models/mpesa_onramp_response.go +++ b/models/mpesa_onramp_response.go @@ -5,3 +5,8 @@ type MpesaOnrampResponse struct { Status string `json:"status"` TransactionCode string `json:"transactionCode"` } + +type MpesaOnrampRatesResponse struct { + Buy float64 `json:"buy"` + Sell float64 `json:"sell"` +} diff --git a/remote/account_service.go b/remote/account_service.go index 0a0078c..1d74ad2 100644 --- a/remote/account_service.go +++ b/remote/account_service.go @@ -33,4 +33,5 @@ type AccountService interface { GetCreditSendMaxLimit(ctx context.Context, poolAddress, fromTokenAddress, toTokenAddress, publicKey string) (*models.CreditSendLimitsResult, error) GetCreditSendReverseQuote(ctx context.Context, poolAddress, fromTokenAddress, toTokenAddress, toTokenAMount string) (*models.CreditSendReverseQouteResult, error) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) + GetMpesaOnrampRates(ctx context.Context) (*models.MpesaOnrampRatesResponse, error) } diff --git a/remote/http/service.go b/remote/http/service.go index c87df90..112c2ce 100644 --- a/remote/http/service.go +++ b/remote/http/service.go @@ -825,6 +825,24 @@ func (as *HTTPAccountService) MpesaTriggerOnramp(ctx context.Context, address, p return &r, nil } +// GetMpesaOnrampRates calls the API to fetch the buying and selling rates for KSH. +func (as *HTTPAccountService) GetMpesaOnrampRates(ctx context.Context) (*models.MpesaOnrampRatesResponse, error) { + var r models.MpesaOnrampRatesResponse + + ctx = context.WithValue(ctx, ctxKeyAuthToken, config.MpesaOnrampBearerToken) + + req, err := http.NewRequest("GET", config.MpresaOnrampRatesURL, nil) + if err != nil { + return nil, err + } + + if _, err := doRequest(ctx, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + // TODO: remove eth-custodial api dependency func doRequest(ctx context.Context, req *http.Request, rcpt any) (*api.OKResponse, error) { var okResponse api.OKResponse diff --git a/testutil/mocks/service_mock.go b/testutil/mocks/service_mock.go index 4e8d7e6..a6bf214 100644 --- a/testutil/mocks/service_mock.go +++ b/testutil/mocks/service_mock.go @@ -135,3 +135,8 @@ func (m MockAccountService) MpesaTriggerOnramp(ctx context.Context, address, pho args := m.Called(address, phoneNumber, asset, amount) return args.Get(0).(*models.MpesaOnrampResponse), args.Error(1) } + +func (m MockAccountService) GetMpesaOnrampRates(ctx context.Context) (*models.MpesaOnrampRatesResponse, error) { + args := m.Called() + return args.Get(0).(*models.MpesaOnrampRatesResponse), args.Error(1) +} diff --git a/testutil/testservice/account_service.go b/testutil/testservice/account_service.go index c278ba1..2c98a8d 100644 --- a/testutil/testservice/account_service.go +++ b/testutil/testservice/account_service.go @@ -136,3 +136,7 @@ func (m TestAccountService) GetCreditSendReverseQuote(ctx context.Context, poolA func (m TestAccountService) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) { return &models.MpesaOnrampResponse{}, nil } + +func (m TestAccountService) GetMpesaOnrampRates(ctx context.Context) (*models.MpesaOnrampRatesResponse, error) { + return &models.MpesaOnrampRatesResponse{}, nil +} \ No newline at end of file