approveTokenOffChain method

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

Implementation

Future<Map<String, dynamic>> approveTokenOffChain(
  String walletAddress,
  String tokenAddress, {
  String? spenderContract,
  String? network = "fuse",
  Map? transactionBody,
  Map? txMetadata,
  num? tokensAmount,
  BigInt? amountInWei,
}) async {
  EthereumAddress wallet = EthereumAddress.fromHex(walletAddress);
  EthereumAddress token = EthereumAddress.fromHex(tokenAddress);
  String nonce = await getNonceForRelay();
  DeployedContract contract = await _contract(
    'TransferManager',
    _transferManagerContractAddress,
  );
  Uint8List data;
  EthereumAddress spender = wallet;
  if (spenderContract != null) {
    spender = EthereumAddress.fromHex(spenderContract);
  }
  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());
    data = contract.function('approveToken').encodeCall(
      [wallet, token, spender, amount],
    );
  } else {
    data = contract.function('approveToken').encodeCall(
      [wallet, token, spender, amountInWei],
    );
  }

  String encodedData = '0x' + HEX.encode(data);

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

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