buildUnsignedTransaction method

  1. @override
Future<String> buildUnsignedTransaction(
  1. SuiTxRequest request, [
  2. SuiNetwork? network
])
override

Builds unsigned BCS transaction bytes as hex. Does not sign or broadcast.

Implementation

@override
Future<String> buildUnsignedTransaction(SuiTxRequest request, [SuiNetwork? network]) async {
  Future<String> instrumentationOperation() async {
    final operationScope = _state.flowScope.capture(replace: false);
    await operationScope.ready();
    operationScope.check();
    final configured = _suiService.getNetworks((_state.projectSettings?.networks?.map((networkGroup) => (networkGroup.chainName == "sui" ? networkGroup.networks?.map((networkConfiguration) => NetworkData(chain: "SUI", networkId: networkConfiguration.networkId, name: networkConfiguration.name, displayName: (networkConfiguration.vanityName == "" ? networkConfiguration.name : (networkConfiguration.vanityName ?? networkConfiguration.name)), rpcUrls: NetworkRpcUrls(http: [...(networkConfiguration.privateCustomerRpcUrls ?? <String>[]), ...networkConfiguration.rpcUrls]), blockExplorerUrls: (networkConfiguration.blockExplorerUrls ?? <String>[]), iconUrl: firstOrNull(networkConfiguration.iconUrls), nativeCurrency: networkConfiguration.nativeCurrency, cluster: networkConfiguration.cluster, genesisHash: networkConfiguration.genesisHash, testnet: (networkConfiguration.testnet ?? false))).toList() ?? const [] : <NetworkData>[])).toList() ?? const []).expand((items) => items).toList(), (_suiState.suiNetworks ?? <SuiNetwork>[]));
    operationScope.check();
    final selected = firstWhereOrNull<SuiNetwork>(configured, (item) => item.name == (_state.activeSuiNetworkName ?? ""));
    final requestedNetwork = (network ?? selected ?? firstOrNull(configured));
    if (requestedNetwork == null) {
      throw DynamicStateException("no Sui GraphQL networks configured; provide one with useSui");
    }
    operationScope.check();
    final resolvedNetworks = _suiService.getNetworks((_state.projectSettings?.networks?.map((networkGroup) => (networkGroup.chainName == "sui" ? networkGroup.networks?.map((networkConfiguration) => NetworkData(chain: "SUI", networkId: networkConfiguration.networkId, name: networkConfiguration.name, displayName: (networkConfiguration.vanityName == "" ? networkConfiguration.name : (networkConfiguration.vanityName ?? networkConfiguration.name)), rpcUrls: NetworkRpcUrls(http: [...(networkConfiguration.privateCustomerRpcUrls ?? <String>[]), ...networkConfiguration.rpcUrls]), blockExplorerUrls: (networkConfiguration.blockExplorerUrls ?? <String>[]), iconUrl: firstOrNull(networkConfiguration.iconUrls), nativeCurrency: networkConfiguration.nativeCurrency, cluster: networkConfiguration.cluster, genesisHash: networkConfiguration.genesisHash, testnet: (networkConfiguration.testnet ?? false))).toList() ?? const [] : <NetworkData>[])).toList() ?? const []).expand((items) => items).toList(), <SuiNetwork>[requestedNetwork]);
    operationScope.check();
    final resolvedNetwork = firstOrNull(resolvedNetworks);
    if (resolvedNetwork == null) {
      throw DynamicStateException("no Sui GraphQL networks configured; provide one with useSui");
    }
    operationScope.check();
    final gasPrice = await _suiService.getReferenceGasPrice(resolvedNetwork);
    operationScope.check();
    final gasBudget = request.gasBudget ?? "10000000";
    final needed = dynParseLong(request.mist) + dynParseLong(gasBudget);
    operationScope.check();
    final candidates = await _suiService.getCoins(request.from, resolvedNetwork);
    operationScope.check();
    if (needed > candidates.fold<int>(0, (sum, item) => sum + item.balanceMist)) {
      throw DynamicStateException("SUI coins do not cover the amount plus the gas budget");
    }
    final unsignedTransaction = SuiUnsignedTransaction(sender: request.from, recipient: request.to, mist: request.mist, gasCoins: candidates, gasPrice: gasPrice, gasBudget: gasBudget).transactionDataHex();
    return unsignedTransaction;
  }
  return await _api.instrumentation.runAsync("sui.buildUnsignedTransaction", instrumentationOperation);
}