executeCreateTXTransaction method
Implementation
Future<BoltPayResponse> executeCreateTXTransaction() async {
String packageId = env == ENV.devnet
? BoltPayConstants.devnetCreateTXPackageId
: env == ENV.testnet
? BoltPayConstants.testnetCreateTXPackageId
: BoltPayConstants.mainnetCreateTXPackageId;
final gasBudget = BigInt.from(10000000);
var txb = TransactionBlock();
txb.setGasBudget(gasBudget);
String coinName = coinType.contains("::") ? coinType.split("::").last : "";
if (idoObjectId?.isNotEmpty ?? false) {
SuiObjectResponse suiObjectResponse = await suiClient.getObject(
idoObjectId ?? '',
options: SuiObjectDataOptions(
showBcs: true,
showContent: true,
showDisplay: true,
showOwner: true,
showPreviousTransaction: true,
showStorageRebate: true,
showType: true));
// IDO TX
String idoPackageId = env == ENV.devnet
? BoltPayConstants.devnetIDOPackageId
: env == ENV.testnet
? BoltPayConstants.testnetIDOPackageId
: BoltPayConstants.mainnetIDOPackageId;
int suiAmount = (double.parse(amount) * (1000000000)).toInt();
var fundingCoin = txb.splitCoins(txb.gas, [txb.pureInt(suiAmount)]);
txb.moveCall(
'$idoPackageId::${BoltPayConstants.module}::${BoltPayConstants.investFunction}',
arguments: [
txb.object(suiObjectResponse.data!.objectId),
txb.pureString(idoObjectName ?? ''),
txb.pureInt(suiAmount),
fundingCoin
],
typeArguments: [
coinType
]);
} else if (coinName == BoltPayConstants.sui) {
// SUI TX
int suiAmount = (double.parse(amount) * (1000000000)).toInt();
var coin = txb.splitCoins(txb.gas, [txb.pureInt(suiAmount)]);
txb.moveCall(
'$packageId::${BoltPayConstants.module}::${BoltPayConstants.createTXfunction}',
arguments: [
coin,
txb.pureInt(int.parse(orderId)),
txb.pureString(merchantName),
txb.pureAddress(merchantWalletAddress),
txb.pureInt((suiAmount)),
],
typeArguments: [
coinType
]);
} else {
// TOKEN TX
var coins =
await suiClient.getCoins(suiClient.getAddress(), coinType: coinType);
if (coins.data.isEmpty) {
return BoltPayResponse(BoltPayConstants.phase203,
BoltPayConstants.errorInsufficientBalanceMsg);
}
CoinMetadataStruct coinMetadata =
await suiClient.getCoinMetadata(coinType);
int tokenAmount = BoltPayConstants.convertTokenAmountToInt(
coinMetadata.decimals, amount);
CoinStruct? coinStruct = coins.data
.where((element) => int.parse(element.balance) >= tokenAmount)
.firstOrNull;
if (coinStruct == null) {
return BoltPayResponse(BoltPayConstants.phase203,
BoltPayConstants.errorInsufficientBalanceMsg);
}
SuiObjectResponse tokenObject =
await suiClient.getObject(coinStruct.coinObjectId);
txb.moveCall(
'$packageId::${BoltPayConstants.module}::${BoltPayConstants.createTXfunction}',
arguments: [
txb.objectRef(tokenObject.data!),
txb.pureInt(int.parse(orderId)),
txb.pureString(BoltPayConstants.boltPay),
txb.pureAddress(merchantWalletAddress),
txb.pureInt((tokenAmount)),
],
typeArguments: [
coinType
]);
}
SuiExecuteTransactionResponse suiExecuteTransactionResponse =
await suiClient.signAndExecuteTransactionBlock(suiAccount, txb,
responseOptions:
SuiTransactionBlockResponseOptions(showEffects: true));
return _handleResponse(suiExecuteTransactionResponse);
}