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); }
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); }