Beispiel #1
0
        public bool AddKeySet(string walletName, HDKeySet keyset)
        {
            KeySetData data = new KeySetData
            {
                KeySet = keyset,
                State  = new HDKeyState()
            };

            return(KeySetTable.GetChild(walletName).Create(keyset.Name, data, false));
        }
Beispiel #2
0
        public static WalletAddress ToWalletAddress(string walletName, KeySetData keysetData, HDKeyData key)
        {
            WalletAddress address = new WalletAddress();

            address.WalletName   = walletName;
            address.RedeemScript = key.RedeemScript;
            address.Address      = key.Address;
            address.HDKey        = key;
            address.HDKeySet     = keysetData.KeySet;
            return(address);
        }
        public async Task <List <WalletAddress> > Scan(string walletName, KeySetData keysetData, int from, int lookahead)
        {
            List <WalletAddress> addedAddresses = new List <WalletAddress>();
            bool nextUnusedChanged = false;
            int  nextToScan        = -1;

            while (true)
            {
                List <uint> used      = new List <uint>();
                var         start     = nextToScan == -1 ? from : nextToScan;
                var         count     = nextToScan == -1 ? lookahead : lookahead - (nextToScan - keysetData.State.NextUnused);
                var         addresses = keysetData.KeySet.GetKeys(start)
                                        .Take(count)
                                        .Select(key => WalletAddress.ToWalletAddress(walletName, keysetData, key))
                                        .ToArray();
                nextToScan = from + lookahead;
                HackToPreventOOM(addresses, Network);
                foreach (var address in addresses)
                {
                    var addWalletResult = await AddWalletAddress(address, true);

                    if (addWalletResult.Empty)
                    {
                        var n = address.HDKey.Path.Indexes.Last();
                        if (!addWalletResult.Empty)
                        {
                            lock (used)
                                used.Add(n);
                        }
                    }
                }
                addedAddresses.AddRange(addresses);
                if (used.Count == 0)
                {
                    break;
                }

                keysetData.State.NextUnused = (int)(used.Max() + 1);
                nextUnusedChanged           = true;
            }
            if (nextUnusedChanged)
            {
                SetKeySet(walletName, keysetData);
            }
            return(addedAddresses);
        }
        public KeySetPropertyViewModel(KeySetData keyset)
        {
            Name           = keyset.KeySet.Name;
            Path           = keyset.KeySet.Path == null ? "" : keyset.KeySet.Path.ToString();
            SignatureCount = keyset.KeySet.SignatureCount;
            CurrentPath    = keyset.State.CurrentPath;
            int keyIndex = 0;

            foreach (var key in keyset.KeySet.ExtPubKeys.Select(k => k.ToString()))
            {
                keyIndex++;
                NewProperty()
                .SetDisplay("Key " + keyIndex)
                .SetEditor(typeof(ReadOnlyTextEditor))
                .SetCategory("General")
                .Commit()
                .SetValue(key);
            }
        }
Beispiel #5
0
        public HDKeySet CreateKeyset(string walletName, [FromBody] HDKeySet keyset)
        {
            AssertValidUrlPart(keyset.Name, "Keyset name");
            if (keyset.ExtPubKeys == null || keyset.ExtPubKeys.Length == 0)
            {
                throw Error(400, "ExtPubKeys not specified");
            }
            if (keyset.ExtPubKeys.Length < keyset.SignatureCount)
            {
                throw Error(400, "SignatureCount should not be higher than the number of HD Keys");
            }
            if (keyset.Path != null && keyset.Path.ToString().Contains("'"))
            {
                throw Error(400, "The keypath should not contains hardened children");
            }
            var repo = Configuration.CreateWalletRepository();

            KeySetData keysetData = new KeySetData
            {
                KeySet = keyset,
                State  = new HDKeyState()
            };

            if (!repo.AddKeySet(walletName, keysetData))
            {
                throw Error(409, "Keyset already exists");
            }

            var newAddresses = repo.Scan(walletName, keysetData, 0, 20);

            foreach (var addresses in newAddresses.Partition(20))
            {
                var unused = Configuration.Topics.AddedAddresses.AddAsync(addresses.ToArray());
            }
            return(keyset);
        }
 public bool SetKeySet(string walletName, KeySetData keysetData)
 {
     return(KeySetTable.GetChild(walletName).Create(keysetData.KeySet.Name, keysetData, true));
 }
 public KeySetViewModel(WalletViewModel parent, KeySetData keyset)
 {
     _Keyset = keyset;
     _Name   = keyset.KeySet.Name;
     _Wallet = parent;
 }