transferNft method

Future<DC<Exception, Stream<SmartWalletEvent>>> transferNft(
  1. EthPrivateKey credentials,
  2. String nftContractAddress,
  3. String recipientAddress,
  4. num tokenId, {
  5. bool? isSafeTransfer = false,
  6. String transactionData = '0x',
  7. Map<String, dynamic>? transactionDetails = const {},
})

Implementation

Future<DC<Exception, Stream<SmartWalletEvent>>> transferNft(
  EthPrivateKey credentials,
  String nftContractAddress,
  String recipientAddress,
  num tokenId, {
  bool? isSafeTransfer = false,
  String transactionData = '0x',
  Map<String, dynamic>? transactionDetails = const {},
}) async {
  final String methodName = 'transferNFT';
  final String walletModule = 'NftTransfer';
  final String walletModuleAddress = smartWallet.walletModules.nftTransfer!;

  final String data = ContractsUtils.encodedDataForContractCall(
    walletModule,
    EthereumAddress.fromHex(walletModuleAddress),
    methodName,
    [
      EthereumAddress.fromHex(smartWallet.smartWalletAddress),
      EthereumAddress.fromHex(nftContractAddress),
      EthereumAddress.fromHex(recipientAddress),
      BigInt.from(tokenId),
      isSafeTransfer,
      hexToBytes(transactionData),
    ],
    include0x: true,
  );

  final Map<String, dynamic> transactionBody = Map.from({
    "from": smartWallet.smartWalletAddress,
    "to": recipientAddress,
    'tokenAddress': nftContractAddress,
    "status": 'pending',
    ...?transactionDetails,
  });

  final String nonce = await _getNonce();
  final String signature = ContractsUtils.signOffChain(
    credentials,
    walletModuleAddress,
    smartWallet.smartWalletAddress,
    data,
    nonce,
  );

  final Relay relayDto = Relay(
    walletModuleAddress: walletModuleAddress,
    walletAddress: smartWallet.smartWalletAddress,
    data: data,
    nonce: nonce,
    methodName: methodName,
    signature: signature,
    walletModule: walletModule,
    transactionBody: transactionBody,
  );

  return _relay(relayDto);
}