public MutableAccount GetOrCreateMutableAccount(Address address)
        {
            // if we already modified it
            if (accounts.TryGetValue(address, out var account))
            {
                return(account);
            }

            Tree.CreateOrUpdate(address.ToRawBytes(), old =>
            {
                // try to get it into the previous state
                if (old != null)
                {
                    // make a new copy
                    account = new MutableAccount(old, Height);
                }
                else
                {
                    account = new MutableAccount(address, Height);
                    AccountCreated.Call(account);
                }

                return(account);
            });

            accounts.Add(address, account);
            return(account);
        }
        public static AccountBalance SetBalance(this MutableAccount account, Currency currency, Amount amount)
        {
            var balance = new AccountBalance(currency, amount);

            account.SetBalance(balance);

            return(balance);
        }
        private static List <Account> MarkNewAccounts(HashSet <Address> knownAccounts, List <Account> accounts)
        {
            var results = new List <Account>();

            foreach (var account in accounts)
            {
                if (knownAccounts.Add(account.Address))
                {
                    var mutable = new MutableAccount(account.Address, account.CurrentLedger);
                    results.Add(mutable.SetBalances(account.Balances).SetDeclaration(account.Declaration));
                }
                else
                {
                    results.Add(account);
                }
            }

            return(results);
        }
 public void SetBalance(MutableAccount account, Currency currency, Amount amount)
 {
     account.SetBalance(currency, amount);
 }