Beispiel #1
0
        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
            });
        }
Beispiel #2
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);
        }
Beispiel #3
0
        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),
            });
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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
            });
        }
Beispiel #6
0
        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
            });
        }
Beispiel #7
0
 public static bool IsERC20RefundedEvent(this EtherScanApi.ContractEvent contractEvent)
 {
     return(contractEvent.EventSignatureHash() == EventSignatureExtractor.GetSignatureHash <ERC20RefundedEventDTO>());
 }