func()

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))
}