in chaincode/src/interbank/interbank.go [75:139]
func (s *InterbankChaincode) interbankTransfer(stub shim.ChaincodeStubInterface, args []string) sc.Response {
toAccNum := args[0]
toBankID := args[1]
amount := args[2]
currency := args[3]
routeAsBytes, err := stub.GetState(toBankID)
if err != nil {
return shim.Error(err.Error())
}
toRoute := &route{}
err = json.Unmarshal(routeAsBytes, toRoute)
if err != nil {
return shim.Error(err.Error())
}
toBankContract := toRoute.BankContract
stringArgs := []string{"queryAccount", toAccNum}
response := stub.InvokeChaincode(toBankContract, util.ArrayToChaincodeArgs(stringArgs), "")
toAccount := &account{}
err = json.Unmarshal(response.Payload, toAccount)
if err != nil {
return shim.Error("Unable to retrieve to account from ledger " + err.Error())
}
var exchangeRate decimal.Decimal
//check if currency conversion is required
if currency == toAccount.Currency {
exchangeRate = decimal.NewFromFloat(1.0)
} else {
forexContract := toRoute.ForexContract
exchangeRateAsFloat, err := currencyConversion(stub, forexContract, currency, toAccount.Currency)
if err != nil {
return shim.Error("Unable to perform currency conversion " + err.Error())
}
exchangeRate = decimal.NewFromFloat(exchangeRateAsFloat)
}
//perform payment
amountAsDecimal, err := decimal.NewFromString(amount)
if err != nil {
return shim.Error(err.Error())
}
amountAsDecimal = amountAsDecimal.Mul(exchangeRate)
amountAsString := amountAsDecimal.String()
stringArgs = []string{"deposit", toAccNum, amountAsString}
response = stub.InvokeChaincode(toBankContract, util.ArrayToChaincodeArgs(stringArgs), "")
if response.GetStatus() != shim.OK {
return shim.Error("Failed to make payment " + err.Error())
}
return (shim.Success(nil))
}