Esempio n. 1
0
        LedgerOperationStatus ILedger.UnfreezeFunds(AccountID accountID, out decimal balance, UInt64 freezeID)
        {
            LedgerOperationStatus status = LedgerOperationStatus.Success;
            //prepare AddFunds/Unfreeze transaction
            TransactionLine transaction = new TransactionLine(accountID,
                                                              0,
                                                              LedgerDatabase.TransactionType.AddFunds, TransactionSubType.Unfreeze);

            if (accountsTable.Contains(accountID))
            {
                AccountLine account = accountsTable.Select(accountID);
                lock (account)
                {
                    if (frozenBalancesTable.Contains(freezeID))
                    {
                        FrozenBalanceLine frozenBalance = frozenBalancesTable.Select(freezeID);
                        balance = frozenBalance.Balance;
                        if (frozenBalance.AccountId != accountID)
                        {
                            transaction.Status       = LedgerDatabase.TransactionStatus.Rejected;
                            transaction.RejectReason = TransactionRejectReason.InvalidAccount;
                            status = LedgerOperationStatus.InvalidAccount;
                        }
                        else
                        {
                            //update account balance and delete freeze record
                            account.Balance += frozenBalance.Balance;
                            frozenBalancesTable.Delete(freezeID);
                        }
                    }
                    else
                    {
                        balance                  = 0;
                        transaction.Status       = LedgerDatabase.TransactionStatus.Rejected;
                        transaction.RejectReason = TransactionRejectReason.InvalidFreezeID;
                        status = LedgerOperationStatus.InvalidFreezeID;
                    }
                }
            }
            else
            {
                balance                  = 0;
                transaction.Status       = LedgerDatabase.TransactionStatus.Rejected;
                transaction.RejectReason = TransactionRejectReason.InvalidAccount;
                status = LedgerOperationStatus.InvalidAccount;
            }

            transactionsTable.Insert(transaction);
            return(status);
        }
Esempio n. 2
0
        LedgerOperationStatus ILedger.FreezeFunds(AccountID accountID, decimal balance, out FreezeID freezeID)
        {
            LedgerOperationStatus status = LedgerOperationStatus.Success;
            //prepare RemoveFunds/Freeze transaction
            TransactionLine transaction = new TransactionLine(accountID,
                                                              balance,
                                                              LedgerDatabase.TransactionType.RemoveFunds, TransactionSubType.Freeze);

            if (accountsTable.Contains(accountID))
            {
                AccountLine account = accountsTable.Select(accountID);
                lock (account)
                {
                    if (balance > account.Balance)
                    {
                        freezeID                 = 0;
                        transaction.Status       = LedgerDatabase.TransactionStatus.Rejected;
                        transaction.RejectReason = TransactionRejectReason.InsufficientFunds;
                        status = LedgerOperationStatus.InsufficientFunds;
                    }
                    else
                    {
                        //update account balance and add freeze record
                        account.Balance -= balance;
                        FrozenBalanceLine frozenBalance = new FrozenBalanceLine(accountID, balance);
                        freezeID = frozenBalancesTable.Insert(frozenBalance);
                    }
                }
            }
            else
            {
                freezeID                 = 0;
                transaction.Status       = LedgerDatabase.TransactionStatus.Rejected;
                transaction.RejectReason = TransactionRejectReason.InvalidAccount;
                status = LedgerOperationStatus.InvalidAccount;
            }

            transactionsTable.Insert(transaction);
            return(status);
        }