private MerchantWithdrawal WithdrawalToOutside(MerchantWallet fromWallet, MerchantWithdrawal fromWithdraw, Cryptocurrency cryptocurrency,
                                                       MerchantAccount account, decimal amount, decimal fee, string address, string tag, string clientIP)
        {
            var actualAmount = amount - fee;

            ILog _logger = LogManager.GetLogger("LogicError");

            using (var scope = new TransactionScope())
            {
                try
                {
                    fromWithdraw.Status = TransactionStatus.UnSubmit;
                    fromWithdraw        = new MerchantWithdrawalDAC().Create(fromWithdraw);
                    var fromWithdrawFee = new MerchantWithdrawalFee
                    {
                        Amount       = amount,
                        Fee          = fee,
                        Timestamp    = DateTime.UtcNow,
                        WithdrawalId = fromWithdraw.Id
                    };
                    new MerchantWithdrawalFeeDAC().Create(fromWithdrawFee);
                    new MerchantWalletDAC().Freeze(fromWallet.Id, amount);

                    //var requestInfo = new FiiiFinanceAgent().TryCreateWithdraw(requestModel);

                    //new MerchantWithdrawalDAC().UpdateTransactionId(fromWithdraw.Id, requestInfo.RequestID,
                    //    requestInfo.TransactionId);

                    scope.Complete();
                }
                catch (CommonException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    _logger.Info($"Withdraw ApplyWithdrawal faild.WithdrawID:{fromWithdraw.Id},OrderNo:{fromWithdraw.OrderNo}.request Parameter - . Error message:{ex.Message}");
                    throw;
                }
            }
            var requestModel = new CreateWithdrawModel
            {
                AccountID        = account.Id,
                AccountType      = AccountTypeEnum.Merchant,
                CryptoName       = cryptocurrency.Code,
                ReceivingAddress = address,
                DestinationTag   = tag,
                Amount           = actualAmount,
                IPAddress        = clientIP,
                TransactionFee   = fee,
                WithdrawalId     = fromWithdraw.Id
            };

            RabbitMQSender.SendMessage("WithdrawSubmit", requestModel);

            return(fromWithdraw);
        }
        public MerchantWallet Insert(MerchantWallet wallet)
        {
            const string sql =
                @"INSERT INTO [dbo].[MerchantWallets]([MerchantAccountId],[CryptoId],[CryptoCode],[Status],[Balance],[FrozenBalance],[Address],[SupportReceipt],[Sequence])
                    VALUES (@MerchantAccountId, @CryptoId,@CryptoCode, @Status, @Balance, @FrozenBalance, @Address,@SupportReceipt,@Sequence); SELECT SCOPE_IDENTITY()";

            using (var con = WriteConnection())
            {
                wallet.Id = con.ExecuteScalar <long>(sql, wallet);
                return(wallet);
            }
        }
Beispiel #3
0
        public override Wallet Insert(Wallet wallet)
        {
            var merchantWallet = new MerchantWallet
            {
                MerchantAccountId = wallet.AccountId,
                CryptoId          = wallet.CryptoId,
                Status            = MerchantWalletStatus.Displayed,
                Balance           = wallet.Balance,
                FrozenBalance     = wallet.FrozenBalance,
                Address           = wallet.Address,
                SupportReceipt    = false,
            };

            merchantWallet = new MerchantWalletDAC().Insert(merchantWallet);
            wallet.Id      = merchantWallet.Id;
            return(wallet);
        }
        public MerchantWallet GenerateWallet(Guid accountId, int cryptoId, string cryptoCode, int sequence = 10000, bool supportReceipt = false)
        {
            var merchantWallet = new MerchantWallet
            {
                MerchantAccountId = accountId,
                CryptoId          = cryptoId,
                CryptoCode        = cryptoCode,
                Status            = MerchantWalletStatus.Displayed,
                Balance           = 0,
                FrozenBalance     = 0,
                SupportReceipt    = supportReceipt,
                Sequence          = sequence
            };

            merchantWallet = new MerchantWalletDAC().Insert(merchantWallet);

            return(merchantWallet);
        }
        //private MerchantWithdrawal WithdrawalToMerchantAccount(MerchantWallet fromWallet, MerchantWithdrawal fromWithdraw, MerchantWallet toWallet)
        //{
        //    MerchantDeposit deposit = null;
        //    using (var scope = new TransactionScope())
        //    {
        //        //提币
        //        fromWithdraw.Status = TransactionStatus.Confirmed;
        //        fromWithdraw.TransactionId = toWallet.MerchantAccountId.ToString("N");
        //        fromWithdraw.SelfPlatform = true;//平台内提币
        //        fromWithdraw = new MerchantWithdrawalDAC().Create(fromWithdraw);

        //        var fromWithdrawFee = new MerchantWithdrawalFee
        //        {
        //            Amount = fromWithdraw.Amount,
        //            Timestamp = DateTime.UtcNow,
        //            Fee = fromWithdraw.Amount * WithdrawalMasterSetting.ToMerchantHandleFeeTier,
        //            WithdrawalId = fromWithdraw.Id
        //        };
        //        new MerchantWithdrawalFeeDAC().Create(fromWithdrawFee);

        //        new MerchantWalletDAC().Decrease(fromWallet.Id, fromWithdraw.Amount);

        //        new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement
        //        {
        //            WalletId = fromWallet.Id,
        //            Action = MerchantWalletStatementAction.Withdrawal,
        //            Amount = -fromWithdraw.Amount,
        //            Balance = fromWallet.Balance - fromWithdraw.Amount,
        //            Timestamp = DateTime.UtcNow
        //        });


        //        //充币
        //        var amount = fromWithdraw.Amount - fromWithdrawFee.Fee;
        //        if (amount <= 0)
        //        {
        //            throw new CommonException(ReasonCode.GENERAL_ERROR, Resources.到账数量不能为零或者负数);
        //        }

        //        deposit = new MerchantDepositDAC().Insert(new MerchantDeposit
        //        {
        //            MerchantAccountId = toWallet.MerchantAccountId,
        //            MerchantWalletId = toWallet.Id,
        //            FromAddress = fromWallet.Address,
        //            ToAddress = toWallet.Address,
        //            Amount = fromWithdraw.Amount - fromWithdrawFee.Fee,
        //            Status = TransactionStatus.Confirmed,
        //            Timestamp = DateTime.UtcNow,
        //            OrderNo = CreateOrderno(),
        //            TransactionId = fromWallet.MerchantAccountId.ToString("N"),
        //            SelfPlatform = true
        //        });
        //        new MerchantWalletDAC().Increase(toWallet.Id, amount);
        //        new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement
        //        {
        //            WalletId = toWallet.Id,
        //            Action = MerchantWalletStatementAction.Deposit,
        //            Amount = amount,
        //            Balance = toWallet.Balance + amount,
        //            Timestamp = DateTime.UtcNow
        //        });


        //        scope.Complete();
        //    }

        //    var withdrawId = fromWithdraw.Id;
        //    var depositId = deposit.Id;

        //    var t1 = Task.Run(() => new FiiiPOSPushComponent().PushWithdrawCompleted(withdrawId));
        //    var t2 = Task.Run(() => new FiiiPOSPushComponent().PushDeposit(depositId));
        //    Task.WaitAll(t1, t2);

        //    return fromWithdraw;
        //}

        private MerchantWithdrawal WithdrawalToUserAccount(MerchantWallet fromWallet, MerchantWithdrawal fromWithdraw,
                                                           UserWallet toWallet, decimal fee)
        {
            UserDeposit deposit;

            using (var scope = new TransactionScope())
            {
                //提币
                fromWithdraw.Status        = TransactionStatus.Confirmed;
                fromWithdraw.TransactionId = toWallet.UserAccountId.ToString("N");
                fromWithdraw.SelfPlatform  = true;//平台内提币
                fromWithdraw = new MerchantWithdrawalDAC().Create(fromWithdraw);

                var fromWithdrawFee = new MerchantWithdrawalFee
                {
                    Amount       = fromWithdraw.Amount,
                    Timestamp    = DateTime.UtcNow,
                    Fee          = fee,
                    WithdrawalId = fromWithdraw.Id
                };
                new MerchantWithdrawalFeeDAC().Create(fromWithdrawFee);

                new MerchantWalletDAC().Decrease(fromWallet.Id, fromWithdraw.Amount);

                new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement
                {
                    WalletId  = fromWallet.Id,
                    Action    = MerchantWalletStatementAction.Withdrawal,
                    Amount    = -fromWithdraw.Amount,
                    Balance   = fromWallet.Balance - fromWithdraw.Amount,
                    Timestamp = DateTime.UtcNow
                });

                //充币
                var amount = fromWithdraw.Amount - fromWithdrawFee.Fee;
                new UserWalletDAC().Increase(toWallet.Id, amount);
                new UserWalletStatementDAC().Insert(new UserWalletStatement
                {
                    WalletId      = toWallet.Id,
                    Action        = UserWalletStatementAction.Deposit,
                    Amount        = amount,
                    Balance       = toWallet.Balance + amount,
                    FrozenAmount  = 0,
                    FrozenBalance = toWallet.FrozenBalance,
                    Timestamp     = DateTime.UtcNow
                });

                deposit = new UserDepositDAC().Insert(new UserDeposit
                {
                    UserAccountId = toWallet.UserAccountId,
                    UserWalletId  = toWallet.Id,
                    FromAddress   = fromWallet.Address,
                    FromTag       = fromWallet.Tag,
                    ToAddress     = toWallet.Address,
                    ToTag         = toWallet.Tag,
                    Amount        = amount,
                    Status        = TransactionStatus.Confirmed,
                    Timestamp     = DateTime.UtcNow,
                    OrderNo       = NumberGenerator.GenerateUnixOrderNo(),
                    TransactionId = fromWallet.MerchantAccountId.ToString("N"),
                    SelfPlatform  = true,
                    CryptoCode    = toWallet.CryptoCode
                });

                new UserTransactionDAC().Insert(new UserTransaction
                {
                    Id         = Guid.NewGuid(),
                    AccountId  = toWallet.UserAccountId,
                    CryptoId   = toWallet.CryptoId,
                    CryptoCode = toWallet.CryptoCode,
                    Type       = UserTransactionType.Deposit,
                    DetailId   = deposit.Id.ToString(),
                    Status     = (byte)deposit.Status,
                    Timestamp  = deposit.Timestamp,
                    Amount     = amount,
                    OrderNo    = deposit.OrderNo
                });

                scope.Complete();
            }

            var withdrawId = fromWithdraw.Id;
            var depositId  = deposit.Id;

            MerchantMSMQ.PubMerchantWithdrawCompleted(withdrawId, 0);
            MerchantMSMQ.PubUserDeposit(depositId, 0);

            return(fromWithdraw);
        }