executeCreateTXTransaction method

Future<BoltPayResponse> executeCreateTXTransaction()

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