approveTokenAndCallContractOffChain method

Future<Map<String, dynamic>> approveTokenAndCallContractOffChain(
  1. String walletAddress,
  2. String tokenAddress,
  3. String contractAddress,
  4. String data, {
  5. String? network = "fuse",
  6. num? tokensAmount,
  7. BigInt? amountInWei,
  8. Map? transactionBody,
  9. Map? txMetadata,
})

Implementation

Future<Map<String, dynamic>> approveTokenAndCallContractOffChain(
  String walletAddress,
  String tokenAddress,
  String contractAddress,
  String data, {
  String? network = "fuse",
  num? tokensAmount,
  BigInt? amountInWei,
  Map? transactionBody,
  Map? txMetadata,
}) async {
  EthereumAddress wallet = EthereumAddress.fromHex(walletAddress);
  EthereumAddress token = EthereumAddress.fromHex(tokenAddress);
  EthereumAddress contract = EthereumAddress.fromHex(contractAddress);
  String encodedApproveTokenAndCallContractData;
  String nonce = await getNonceForRelay();
  DeployedContract TransferManagerContract =
      await _contract('TransferManager', _transferManagerContractAddress);
  if (tokensAmount != null) {
    dynamic tokenDetails = await getTokenDetails(tokenAddress);
    int tokenDecimals = int.parse(tokenDetails["decimals"].toString());
    Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString());
    Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString());
    BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString());
    Uint8List approveTokenAndCallContractData =
        TransferManagerContract.function('approveTokenAndCallContract')
            .encodeCall([
      wallet,
      token,
      contract,
      amount,
      HEX.decode(data),
    ]);
    encodedApproveTokenAndCallContractData =
        '0x' + HEX.encode(approveTokenAndCallContractData);
  } else {
    Uint8List approveTokenAndCallContractData =
        TransferManagerContract.function('approveTokenAndCallContract')
            .encodeCall([
      wallet,
      token,
      contract,
      amountInWei,
      HEX.decode(data),
    ]);
    encodedApproveTokenAndCallContractData =
        '0x' + HEX.encode(approveTokenAndCallContractData);
  }

  String signature = await signOffChain(
    _transferManagerContractAddress,
    walletAddress,
    BigInt.from(0),
    encodedApproveTokenAndCallContractData,
    nonce,
    BigInt.from(0),
    BigInt.from(_defaultGasLimit),
  );

  return {
    "walletAddress": walletAddress,
    "methodData": encodedApproveTokenAndCallContractData,
    "communityAddress": _defaultCommunityContractAddress,
    "nonce": nonce,
    "network": network,
    "methodName": "approveTokenAndCallContract",
    "gasPrice": 0,
    "gasLimit": _defaultGasLimit,
    "signature": signature,
    "walletModule": "TransferManager",
    'transactionBody': transactionBody,
    "txMetadata": txMetadata,
  };
}