///--------------------------------------------------------------------------------------------------------
        ///
        protected override async Task <bool> OnStart(long requesterId, string requesterName, DateTime requestTime, params object[] args)
        {
            //if(QtumHandler.IsStakingState())
            //{
            //    await SendMessage(requesterId, strings.GetString("채굴 상태에서는 전송 할 수 없습니다."));
            //    IsCompleted = true;
            //    return true;
            //}

            myAddress  = "";
            destAdress = "";

            myAddressList.Clear();

            QtumHandler.GetInfo(out myAddressList);

            if (myAddressList.Count == 0 || QtumHandler.GetBalance() == 0)
            {
                IsCompleted = true;

                await SendMessage(requesterId, strings.GetString("지갑이 비어있습니다."));
            }
            else
            {
                commandState = eSendCommandState.InputWaitOtp;

                otpWaitUserId = requesterId;

                waitStartTime = DateTime.Now;

                await SendMessage(requesterId, strings.GetString("Otp 인증 번호를 입력 하세요."));
            }

            return(true);
        }
        ///--------------------------------------------------------------------------------------------------------
        ///
        protected override void OnFinish()
        {
            base.OnFinish();

            Logger.Log("보내기 응답 완료.\n");

            commandState = eSendCommandState.Ready;

            waitStartTime = DateTime.MinValue;

            //destAdress = "";
        }
        ///--------------------------------------------------------------------------------------------------------
        ///
        public override async Task OnMessage(Telegram.Bot.Types.Message message)
        {
            await base.OnMessage(message);

            string msg = message.Text.Trim();

            long requesterId = message.Chat.Id;

            if (requesterId != otpWaitUserId)
            {
                return;
            }

            switch (commandState)
            {
            case eSendCommandState.InputWaitOtp:
            {
                string otpStr = message.Text.Trim();

                if (OtpChecker.CheckOtp(otpStr))
                {
                    commandState = eSendCommandState.InputWaitSendAddress;

                    waitStartTime = DateTime.Now;

                    string sendMsg = strings.GetString("사용 할 본인의 주소를 번호로 선택하세요.");

                    sendMsg += "\n0. " + strings.GetString("자동으로 선택");

                    int num = 1;
                    foreach (var pair in myAddressList)
                    {
                        sendMsg += string.Format("\n{0}. {1}:{2} Qtum", num, GetAddressLink(pair.Key), pair.Value);
                        ++num;
                    }

                    await SendMessage(requesterId, sendMsg);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("Otp 인증에 실패 했습니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitSendAddress:
            {
                string[] args       = msg.Split(' ');
                int      addressNum = 0;
                if (args.Length <= 0 || int.TryParse(args[0], out addressNum) == false || addressNum <0 || addressNum> myAddressList.Count)
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                }
                else
                {
                    if (addressNum == 0)
                    {
                        myAddress = "";         // 자동이면 주소가 없습니다.
                    }
                    else
                    {
                        myAddress = myAddressList.Keys.ToArray()[addressNum - 1];
                    }

                    if (string.IsNullOrEmpty(myAddress) || QtumHandler.IsValidateAddress(myAddress))
                    {
                        commandState = eSendCommandState.InputWaitReceiveAddress;

                        waitStartTime = DateTime.Now;

                        await SendMessage(requesterId, strings.GetString("상대방의 퀀텀 주소를 입력하세요."));
                    }
                    else
                    {
                        IsCompleted = true;

                        await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                    }
                }
            }
            break;

            case eSendCommandState.InputWaitReceiveAddress:
            {
                bool invalidMyAddress = false;

                double myBalance = 0;

                if (string.IsNullOrEmpty(myAddress) == false && myAddressList.TryGetValue(myAddress, out myBalance) == false)
                {
                    invalidMyAddress = true;
                }

                if (invalidMyAddress == false && QtumHandler.IsValidateAddress(msg))
                {
                    destAdress = msg;

                    commandState = eSendCommandState.InputWaitAmount;

                    waitStartTime = DateTime.Now;

                    if (string.IsNullOrEmpty(myAddress) || myAddressList.TryGetValue(myAddress, out myBalance) == false)
                    {
                        myBalance = QtumHandler.GetBalance();
                    }
                    else
                    {
                        myBalance = myAddressList[myAddress];
                    }

                    string sendMsg = strings.GetString("보낼 수량을 입력하세요.");

                    sendMsg += "\n" + strings.Format("가능 수량 {0}", myAddress + " " + myBalance);

                    await SendMessage(requesterId, sendMsg);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("유효하지 않은 주소입니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitAmount:
            {
                double amount = 0;
                if (double.TryParse(msg, out amount) && QtumHandler.GetBalance() >= amount)
                {
                    destAmount = amount;

                    commandState = eSendCommandState.InputWaitConfirm;

                    string myAddressStr = myAddress;

                    if (string.IsNullOrEmpty(myAddressStr))
                    {
                        myAddressStr = strings.GetString("자동으로 선택");
                    }

                    string str = strings.Format("나의 주소 : {0}", GetAddressLink(myAddressStr)) + "\n" + strings.Format("받는 주소 : {0}", GetAddressLink(destAdress)) + "\n" + strings.Format("보낼 수량 : {0}", destAmount);
                    str += "\n" + strings.Format("정말 진행 하시려면 숫자 1을 입력하세요.");

                    waitStartTime = DateTime.Now;

                    await SendMessage(requesterId, str);
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("수량이 부족합니다."));
                }
            }
            break;

            case eSendCommandState.InputWaitConfirm:
            {
                int num = 0;
                if (int.TryParse(msg, out num) && num == 1)
                {
                    commandState = eSendCommandState.Ready;

                    waitStartTime = DateTime.MinValue;

                    string result = QtumHandler.Send(myAddress, destAdress, destAmount);

                    if (string.IsNullOrEmpty(result) == false)
                    {
                        string sendResultMsg = string.Format("tx: {0}", GetTxLink(result));
                        await SendMessage(requesterId, sendResultMsg);
                        await SendMessage(requesterId, strings.GetString("보내기 응답 완료.\n"));
                    }
                    else
                    {
                        await SendMessage(requesterId, strings.GetString("보내기에 실패했습니다."));
                    }

                    IsCompleted = true;
                }
                else
                {
                    IsCompleted = true;

                    await SendMessage(requesterId, strings.GetString("보내기가 취소되었습니다."));
                }
            }
            break;
            }
        }