added the MpesaTriggerOnramp function

This commit is contained in:
Alfred Kamanda 2025-11-28 09:42:35 +03:00
parent a865a3ba2d
commit dda1d0d9db
Signed by: Alfred-mk
GPG Key ID: E60B2165A97F4D41
5 changed files with 59 additions and 0 deletions

View File

@ -921,3 +921,11 @@ func (das *DevAccountService) GetCreditSendReverseQuote(ctx context.Context, poo
OutputAmount: "40000000",
}, nil
}
func (das *DevAccountService) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) {
return &models.MpesaOnrampResponse{
Message: "Success, kindly accept prompt sent.",
Status: "PENDING",
TransactionCode: "ae6fb33b-4653-4f38-a3b6-85dfea7a1e99",
}, nil
}

View File

@ -32,4 +32,5 @@ type AccountService interface {
CheckTokenInPool(ctx context.Context, poolAddress, tokenAddress string) (*models.TokenInPoolResult, error)
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)
}

View File

@ -784,6 +784,47 @@ func (as *HTTPAccountService) GetCreditSendReverseQuote(ctx context.Context, poo
return &r, nil
}
// MpesaTriggerOnramp calls the API to perform an STK Push.
// Parameters:
// - address: The user's public key.
// - phoneNumber: The user's phone number
// - asset: the intented USD voucher "USDT | USDC | cUSD"
// - amount: The amount in Kenyan shillings
func (as *HTTPAccountService) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) {
var r models.MpesaOnrampResponse
ctx = context.WithValue(ctx, ctxKeyAuthToken, config.MpesaOnrampBearerToken)
// Prepare payload
payload := struct {
Address string `json:"address"`
PhoneNumber string `json:"phoneNumber"`
Asset string `json:"asset"`
Amount int `json:"amount"`
}{
Address: strings.TrimSpace(address),
PhoneNumber: strings.TrimSpace(phoneNumber),
Asset: strings.TrimSpace(asset),
Amount: amount,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return nil, fmt.Errorf("failed to marshal mpesa onramp payload: %w", err)
}
req, err := http.NewRequest("POST", config.MpesaOnrampURL, bytes.NewBuffer(payloadBytes))
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

View File

@ -130,3 +130,8 @@ func (m MockAccountService) GetCreditSendReverseQuote(ctx context.Context, poolA
args := m.Called(poolAddress, fromTokenAddress, toTokenAddress, toTokenAMount)
return args.Get(0).(*models.CreditSendReverseQouteResult), args.Error(1)
}
func (m MockAccountService) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) {
args := m.Called(address, phoneNumber, asset, amount)
return args.Get(0).(*models.MpesaOnrampResponse), args.Error(1)
}

View File

@ -132,3 +132,7 @@ func (m TestAccountService) GetCreditSendMaxLimit(ctx context.Context, poolAddre
func (m TestAccountService) GetCreditSendReverseQuote(ctx context.Context, poolAddress, fromTokenAddress, toTokenAddress, toTokenAMount string) (*models.CreditSendReverseQouteResult, error) {
return &models.CreditSendReverseQouteResult{}, nil
}
func (m TestAccountService) MpesaTriggerOnramp(ctx context.Context, address, phoneNumber, asset string, amount int) (*models.MpesaOnrampResponse, error) {
return &models.MpesaOnrampResponse{}, nil
}