public static ERC20InitiatedEventDTO ParseERC20InitiatedEvent( this EtherScanApi.ContractEvent contractEvent) { var eventSignatureHash = EventSignatureExtractor.GetSignatureHash <ERC20InitiatedEventDTO>(); if (contractEvent.Topics == null || contractEvent.Topics.Count != 4 || contractEvent.EventSignatureHash() != eventSignatureHash) { throw new Exception("Invalid contract event"); } var initiatorHex = contractEvent.HexData.Substring(PrefixOffset, TopicSizeInHex); var refundTimeHex = contractEvent.HexData.Substring(PrefixOffset + TopicSizeInHex, TopicSizeInHex); var countdownHex = contractEvent.HexData.Substring(PrefixOffset + 2 * TopicSizeInHex, TopicSizeInHex); var valueHex = contractEvent.HexData.Substring(PrefixOffset + 3 * TopicSizeInHex, TopicSizeInHex); var redeemFeeHex = contractEvent.HexData.Substring(PrefixOffset + 4 * TopicSizeInHex, TopicSizeInHex); var active = contractEvent.HexData.Substring(PrefixOffset + 5 * TopicSizeInHex, TopicSizeInHex); return(new ERC20InitiatedEventDTO { HashedSecret = Hex.FromString(contractEvent.Topics[1], true), ERC20Contract = $"0x{contractEvent.Topics[2].Substring(contractEvent.Topics[2].Length - AddressLengthInHex)}", Participant = $"0x{contractEvent.Topics[3].Substring(contractEvent.Topics[3].Length - AddressLengthInHex)}", Initiator = $"0x{initiatorHex.Substring(initiatorHex.Length - AddressLengthInHex)}", RefundTimestamp = new HexBigInteger(refundTimeHex).Value, Countdown = new HexBigInteger(countdownHex).Value, Value = new HexBigInteger(valueHex).Value, RedeemFee = new HexBigInteger(redeemFeeHex).Value, Active = new HexBigInteger(active).Value != 0 }); }
public static EthereumTransaction TransformTransferEvent( this EtherScanApi.ContractEvent contractEvent, string address, EthereumTokens.ERC20 erc20, long lastBlockNumber) { if (!contractEvent.IsERC20TransferEvent()) { return(null); } var transferEvent = contractEvent.ParseERC20TransferEvent(); var tx = new EthereumTransaction() //todo: make a refactoring { Currency = erc20, Id = contractEvent.HexTransactionHash, Type = transferEvent.From == address ? transferEvent.To == erc20.SwapContractAddress.ToLowerInvariant() //todo: change to erc20.SwapContractAddress after currencies.json update ? BlockchainTransactionType.Output | BlockchainTransactionType.SwapPayment : BlockchainTransactionType.Output : BlockchainTransactionType.Input, //todo: recognize redeem&refund State = BlockchainTransactionState.Confirmed, //todo: check if true in 100% cases CreationTime = contractEvent.HexTimeStamp.Substring(PrefixOffset).FromHexString(), From = transferEvent.From, To = transferEvent.To, Amount = transferEvent.Value.ToHexBigInteger(), ////Nonce GasPrice = new HexBigInteger(contractEvent.HexGasPrice).Value, ////GasLimit GasLimit = new HexBigInteger(contractEvent.HexGasUsed).Value, ReceiptStatus = true, IsInternal = transferEvent.From == erc20.SwapContractAddress.ToLowerInvariant() || transferEvent.To == erc20.SwapContractAddress.ToLowerInvariant(), InternalIndex = 0, BlockInfo = new BlockInfo { Confirmations = 1 + (int)(lastBlockNumber - long.Parse(contractEvent.HexBlockNumber.Substring(PrefixOffset), System.Globalization.NumberStyles.HexNumber)), // //Confirmations = txReceipt.Status != null // //? (int)txReceipt.Status.Value // //: 0, // //BlockHash = tx.BlockHash, BlockHeight = long.Parse(contractEvent.HexBlockNumber.Substring(PrefixOffset), System.Globalization.NumberStyles.HexNumber), // //BlockTime = blockTimeStamp, // //FirstSeen = blockTimeStamp } }; return(tx); }
public static ERC20RefundedEventDTO ParseRefundedEvent( this EtherScanApi.ContractEvent contractEvent) { var eventSignatureHash = EventSignatureExtractor.GetSignatureHash <ERC20RefundedEventDTO>(); if (contractEvent.Topics == null || contractEvent.Topics.Count != 2 || contractEvent.EventSignatureHash() != eventSignatureHash) { throw new Exception("Invalid contract event"); } return(new ERC20RefundedEventDTO { HashedSecret = Hex.FromString(contractEvent.Topics[1], true), }); }
public static EthereumTransaction TransformApprovalEvent( this EtherScanApi.ContractEvent contractEvent, EthereumTokens.ERC20 erc20, long lastBlockNumber) { if (!contractEvent.IsERC20ApprovalEvent()) { return(null); } var approvalEvent = contractEvent.ParseERC20ApprovalEvent(); var tx = new EthereumTransaction() //todo: make a refactoring { Currency = erc20, Id = contractEvent.HexTransactionHash, Type = BlockchainTransactionType.Output | BlockchainTransactionType.TokenApprove, State = BlockchainTransactionState.Confirmed, //todo: check if true in 100% cases CreationTime = contractEvent.HexTimeStamp.Substring(PrefixOffset).FromHexString(), From = approvalEvent.Owner, To = approvalEvent.Spender, Amount = 0, ////Nonce GasPrice = new HexBigInteger(contractEvent.HexGasPrice).Value, ////GasLimit GasLimit = new HexBigInteger(contractEvent.HexGasUsed).Value, ReceiptStatus = true, IsInternal = false, InternalIndex = 0, BlockInfo = new BlockInfo { Confirmations = 1 + (int)(lastBlockNumber - long.Parse(contractEvent.HexBlockNumber.Substring(PrefixOffset), System.Globalization.NumberStyles.HexNumber)), // //Confirmations = txReceipt.Status != null // //? (int)txReceipt.Status.Value // //: 0, // //BlockHash = tx.BlockHash, BlockHeight = long.Parse(contractEvent.HexBlockNumber.Substring(PrefixOffset), System.Globalization.NumberStyles.HexNumber), // //BlockTime = blockTimeStamp, // //FirstSeen = blockTimeStamp } }; return(tx); }
public static ERC20AddedEventDTO ParseERC20AddedEvent( this EtherScanApi.ContractEvent contractEvent) { var eventSignatureHash = EventSignatureExtractor.GetSignatureHash <ERC20AddedEventDTO>(); if (contractEvent.Topics == null || contractEvent.Topics.Count != 2 || contractEvent.EventSignatureHash() != eventSignatureHash) { throw new Exception("Invalid contract event"); } var initiatorHex = contractEvent.HexData.Substring(PrefixOffset, TopicSizeInHex); var valueHex = contractEvent.HexData.Substring(PrefixOffset + TopicSizeInHex, TopicSizeInHex); return(new ERC20AddedEventDTO { HashedSecret = Hex.FromString(contractEvent.Topics[1], true), Initiator = $"0x{initiatorHex.Substring(initiatorHex.Length - AddressLengthInHex)}", Value = new HexBigInteger(valueHex).Value }); }
public static ERC20TransferEventDTO ParseERC20TransferEvent( this EtherScanApi.ContractEvent contractEvent) { var eventSignatureHash = EventSignatureExtractor.GetSignatureHash <ERC20TransferEventDTO>(); if (contractEvent.Topics == null || contractEvent.Topics.Count != 3 || contractEvent.EventSignatureHash() != eventSignatureHash) { throw new Exception("Invalid ERC20 token contract event"); } var valueHex = contractEvent.HexData.Substring(PrefixOffset, TopicSizeInHex); return(new ERC20TransferEventDTO { From = $"0x{contractEvent.Topics[1].Substring(contractEvent.Topics[1].Length - AddressLengthInHex)}", To = $"0x{contractEvent.Topics[2].Substring(contractEvent.Topics[2].Length - AddressLengthInHex)}", Value = new HexBigInteger(valueHex).Value }); }
public static bool IsERC20RefundedEvent(this EtherScanApi.ContractEvent contractEvent) { return(contractEvent.EventSignatureHash() == EventSignatureExtractor.GetSignatureHash <ERC20RefundedEventDTO>()); }