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