buildSpendTransaction method
Future<Result<ShelleyTransaction, String> >
buildSpendTransaction({
- required ShelleyAddress toAddress,
- required int lovelace,
- int ttl = 0,
- 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;
}