private static Dictionary <string, List <InteropTransfer> > GetInteropTransfers(Nexus nexus, Logger logger, TransactionReceipt txr, EthAPI api, string swapAddress) { logger.Debug($"get interop transfers for tx {txr.TransactionHash}"); var interopTransfers = new Dictionary <string, List <InteropTransfer> >(); Nethereum.RPC.Eth.DTOs.Transaction tx = null; try { // tx to get the eth transfer if any tx = api.GetTransaction(txr.TransactionHash); } catch (Exception e) { logger.Error("Getting eth tx failed: " + e.Message); } logger.Debug("Transaction status: " + txr.Status.Value); // check if tx has failed if (txr.Status.Value == 0) { logger.Error($"tx {txr.TransactionHash} failed"); return(interopTransfers); } var nodeSwapAddress = EthereumWallet.EncodeAddress(swapAddress); var events = txr.DecodeAllEvents <TransferEventDTO>(); var interopAddress = ExtractInteropAddress(tx); // ERC20 foreach (var evt in events) { var asset = EthUtils.FindSymbolFromAsset(nexus, evt.Log.Address); if (asset == null) { logger.Warning($"Asset [{evt.Log.Address}] not supported"); continue; } var targetAddress = EthereumWallet.EncodeAddress(evt.Event.To); var sourceAddress = EthereumWallet.EncodeAddress(evt.Event.From); var amount = PBigInteger.Parse(evt.Event.Value.ToString()); if (targetAddress.Equals(nodeSwapAddress)) { if (!interopTransfers.ContainsKey(evt.Log.TransactionHash)) { interopTransfers.Add(evt.Log.TransactionHash, new List <InteropTransfer>()); } interopTransfers[evt.Log.TransactionHash].Add ( new InteropTransfer ( EthereumWallet.EthereumPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, asset, amount ) ); } } if (tx.Value != null && tx.Value.Value > 0) { var targetAddress = EthereumWallet.EncodeAddress(tx.To); var sourceAddress = EthereumWallet.EncodeAddress(tx.From); if (targetAddress.Equals(nodeSwapAddress)) { var amount = PBigInteger.Parse(tx.Value.ToString()); if (!interopTransfers.ContainsKey(tx.TransactionHash)) { interopTransfers.Add(tx.TransactionHash, new List <InteropTransfer>()); } interopTransfers[tx.TransactionHash].Add ( new InteropTransfer ( EthereumWallet.EthereumPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, "ETH", // TODO use const amount ) ); } } return(interopTransfers); }
private static Dictionary <string, List <InteropTransfer> > GetInteropTransfers(Nexus nexus, Logger logger, TransactionReceipt txr, EthAPI api, string[] swapAddresses) { logger.Debug($"get interop transfers for tx {txr.TransactionHash}"); var interopTransfers = new Dictionary <string, List <InteropTransfer> >(); Nethereum.RPC.Eth.DTOs.Transaction tx = null; try { // tx to get the eth transfer if any tx = api.GetTransaction(txr.TransactionHash); } catch (Exception e) { logger.Error("Getting eth tx failed: " + e.Message); } Console.WriteLine("txr: " + txr.Status); logger.Debug("Transaction status: " + txr.Status.Value); // check if tx has failed if (txr.Status.Value == 0) { logger.Error($"tx {txr.TransactionHash} failed"); return(interopTransfers); } foreach (var a in swapAddresses) { Console.WriteLine("swap address: " + a); } var nodeSwapAddresses = swapAddresses.Select(x => BSCWallet.EncodeAddress(x)); var interopAddress = ExtractInteropAddress(tx); Console.WriteLine("interop address: " + interopAddress); // ERC721 (NFT) // TODO currently this code block is mostly copypaste from BEP20 block, later make a single method for both... //var erc721_events = txr.DecodeAllEvents<Nethereum.StandardNonFungibleTokenERC721.ContractDefinition.TransferEventDTOBase>(); //foreach (var evt in erc721_events) //{ // var asset = EthUtils.FindSymbolFromAsset(nexus, evt.Log.Address); // if (asset == null) // { // logger.Warning($"Asset [{evt.Log.Address}] not supported"); // continue; // } // var targetAddress = BSCWallet.EncodeAddress(evt.Event.To); // var sourceAddress = BSCWallet.EncodeAddress(evt.Event.From); // var tokenID = PBigInteger.Parse(evt.Event.TokenId.ToString()); // if (nodeSwapAddresses.Contains(targetAddress)) // { // if (!interopTransfers.ContainsKey(evt.Log.TransactionHash)) // { // interopTransfers.Add(evt.Log.TransactionHash, new List<InteropTransfer>()); // } // string tokenURI = FetchTokenURI(evt.Log.Address, evt.Event.TokenId); // interopTransfers[evt.Log.TransactionHash].Add // ( // new InteropTransfer // ( // BSCWallet.BSCPlatform, // sourceAddress, // DomainSettings.PlatformName, // targetAddress, // interopAddress, // asset, // tokenID, // System.Text.Encoding.UTF8.GetBytes(tokenURI) // ) // ); // } //} // BEP20 var bep20_events = txr.DecodeAllEvents <TransferEventDTO>(); foreach (var evt in bep20_events) { var asset = EthUtils.FindSymbolFromAsset(BSCWallet.BSCPlatform, nexus, evt.Log.Address); if (asset == null) { logger.Warning($"Asset [{evt.Log.Address}] not supported"); continue; } var targetAddress = BSCWallet.EncodeAddress(evt.Event.To); var sourceAddress = BSCWallet.EncodeAddress(evt.Event.From); var amount = PBigInteger.Parse(evt.Event.Value.ToString()); if (nodeSwapAddresses.Contains(targetAddress)) { if (!interopTransfers.ContainsKey(evt.Log.TransactionHash)) { interopTransfers.Add(evt.Log.TransactionHash, new List <InteropTransfer>()); } interopTransfers[evt.Log.TransactionHash].Add ( new InteropTransfer ( BSCWallet.BSCPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, asset, amount ) ); } } Console.WriteLine("value: " + tx.Value); Console.WriteLine("value: " + tx.Value.Value); if (tx.Value != null && tx.Value.Value > 0) { var targetAddress = BSCWallet.EncodeAddress(tx.To); var sourceAddress = BSCWallet.EncodeAddress(tx.From); foreach (var a in nodeSwapAddresses) { Console.WriteLine("node swap address: " + a); } Console.WriteLine("target address: " + targetAddress); if (nodeSwapAddresses.Contains(targetAddress)) { var amount = PBigInteger.Parse(tx.Value.ToString()); if (!interopTransfers.ContainsKey(tx.TransactionHash)) { interopTransfers.Add(tx.TransactionHash, new List <InteropTransfer>()); } interopTransfers[tx.TransactionHash].Add ( new InteropTransfer ( BSCWallet.BSCPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, "BSC", // TODO use const amount ) ); } } return(interopTransfers); }
private static Dictionary <string, List <InteropTransfer> > GetInteropTransfers(Nexus nexus, Logger logger, TransactionReceipt txr, EthAPI api, string[] swapAddresses) { logger.Debug($"get interop transfers for tx {txr.TransactionHash}"); var interopTransfers = new Dictionary <string, List <InteropTransfer> >(); Nethereum.RPC.Eth.DTOs.Transaction tx = null; try { // tx to get the eth transfer if any tx = api.GetTransaction(txr.TransactionHash); } catch (Exception e) { logger.Error("Getting eth tx failed: " + e.Message); } logger.Debug("Transaction status: " + txr.Status.Value); // check if tx has failed if (txr.Status.Value == 0) { logger.Error($"tx {txr.TransactionHash} failed"); return(interopTransfers); } var nodeSwapAddresses = swapAddresses.Select(x => EthereumWallet.EncodeAddress(x)); Address interopAddress; try { interopAddress = ExtractInteropAddress(tx, logger); } catch (Exception e) { if (e.ToString().Contains("Header byte out of range")) { // Ignoring this exception and skipping this tx. // RecoverFromSignature() crashed and we cannot avoid it atm. // Related to EIP-1559, example of probematic tx: https://etherscan.io/tx/0xb022c146d8d1e684de0c1faae43e7ce36afb6969719adfdcafcc5bb7d5913185 // TODO Fix by updating to new Nethereum and dealing with EIP-1559 better. logger.Debug("Warning: Skipping 'Header byte out of range' tx: " + tx.TransactionHash); return(interopTransfers); } else { throw; } } // ERC721 (NFT) // TODO currently this code block is mostly copypaste from ERC20 block, later make a single method for both... //var erc721_events = txr.DecodeAllEvents<Nethereum.StandardNonFungibleTokenERC721.ContractDefinition.TransferEventDTOBase>(); //foreach (var evt in erc721_events) //{ // var asset = EthUtils.FindSymbolFromAsset(nexus, evt.Log.Address); // if (asset == null) // { // logger.Warning($"Asset [{evt.Log.Address}] not supported"); // continue; // } // var targetAddress = EthereumWallet.EncodeAddress(evt.Event.To); // var sourceAddress = EthereumWallet.EncodeAddress(evt.Event.From); // var tokenID = PBigInteger.Parse(evt.Event.TokenId.ToString()); // if (nodeSwapAddresses.Contains(targetAddress)) // { // if (!interopTransfers.ContainsKey(evt.Log.TransactionHash)) // { // interopTransfers.Add(evt.Log.TransactionHash, new List<InteropTransfer>()); // } // string tokenURI = FetchTokenURI(evt.Log.Address, evt.Event.TokenId); // interopTransfers[evt.Log.TransactionHash].Add // ( // new InteropTransfer // ( // EthereumWallet.EthereumPlatform, // sourceAddress, // DomainSettings.PlatformName, // targetAddress, // interopAddress, // asset, // tokenID, // System.Text.Encoding.UTF8.GetBytes(tokenURI) // ) // ); // } //} // ERC20 var erc20_events = txr.DecodeAllEvents <TransferEventDTO>(); foreach (var evt in erc20_events) { var asset = EthUtils.FindSymbolFromAsset(EthereumWallet.EthereumPlatform, nexus, evt.Log.Address); if (asset == null) { logger.Warning($"Asset [{evt.Log.Address}] not supported"); continue; } var targetAddress = EthereumWallet.EncodeAddress(evt.Event.To); var sourceAddress = EthereumWallet.EncodeAddress(evt.Event.From); var amount = PBigInteger.Parse(evt.Event.Value.ToString()); if (nodeSwapAddresses.Contains(targetAddress)) { if (!interopTransfers.ContainsKey(evt.Log.TransactionHash)) { interopTransfers.Add(evt.Log.TransactionHash, new List <InteropTransfer>()); } interopTransfers[evt.Log.TransactionHash].Add ( new InteropTransfer ( EthereumWallet.EthereumPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, asset, amount ) ); } } if (tx.Value != null && tx.Value.Value > 0) { var targetAddress = EthereumWallet.EncodeAddress(tx.To); var sourceAddress = EthereumWallet.EncodeAddress(tx.From); if (nodeSwapAddresses.Contains(targetAddress)) { var amount = PBigInteger.Parse(tx.Value.ToString()); if (!interopTransfers.ContainsKey(tx.TransactionHash)) { interopTransfers.Add(tx.TransactionHash, new List <InteropTransfer>()); } interopTransfers[tx.TransactionHash].Add ( new InteropTransfer ( EthereumWallet.EthereumPlatform, sourceAddress, DomainSettings.PlatformName, targetAddress, interopAddress, "ETH", // TODO use const amount ) ); } } return(interopTransfers); }