buildSpendTransaction method

  1. @override
Future<Result<ShelleyTransaction, String>> buildSpendTransaction({
  1. required ShelleyAddress toAddress,
  2. required int lovelace,
  3. int ttl = 0,
  4. int fee = 0,
})
override

Build a simple spend transaction.

Implementation

@override
Future<Result<ShelleyTransaction, String>> buildSpendTransaction({
  required ShelleyAddress toAddress,
  required int lovelace,
  int ttl = 0,
  int fee = 0,
}) async {
  if (lovelace > balance) {
    return Err('insufficient balance');
  }
  if (toAddress.addressType != AddressType.base) {
    return Err('only base shelley addresses currently supported');
  }
  if (toAddress.hrp != 'addr' && toAddress.hrp != 'addr_test') {
    return Err(
        "not a valid shelley external addresses, expecting 'addr' or 'addr_test' prefix");
  }
  //coin selection:
  //TODO handle edge-case where fee adjustment requires input recalculation.
  const Coin maxFeeGuess = 200000; //0.2 ADA
  final inputsResult = await coinSelectionFunction(
    unspentInputsAvailable: unspentTransactions,
    outputsRequested: [MultiAssetRequest.lovelace(lovelace + maxFeeGuess)],
    ownedAddresses: addresses.toSet(),
  );
  if (inputsResult.isErr()) return Err(inputsResult.unwrapErr().message);
  //use builder to build ShelleyTransaction
  //final pair = hdWallet.accountKeys();
  final builder = TransactionBuilder()
    ..inputs(inputsResult.unwrap().inputs)
    ..value(ShelleyValue(coin: lovelace, multiAssets: []))
    ..toAddress(toAddress)
    ..wallet(this) //contains sign key & verify key
    ..blockchainAdapter(blockchainAdapter)
    ..changeAddress(firstUnusedChangeAddress)
    ..ttl(ttl)
    ..fee(fee);
  final txResult = await builder.buildAndSign();
  if (txResult.isOk() && !txResult.unwrap().verify) {
    return Err('transaction validation failed');
  }
  return txResult;
}