//TODO thread safety //TODO need to rescan utxo when addresses are added as well public void AddAddress(IWalletAddress address) { //TODO add to queue, cannot monitor address until chain position moves var startChainPosition = ChainPosition.Fake(); var monitoredRange = new[] { Tuple.Create(startChainPosition, startChainPosition) }.ToList(); foreach (var outputScriptHash in address.GetOutputScriptHashes()) { List<MonitoredWalletAddress> addresses; if (!this.addressesByOutputScriptHash.TryGetValue(outputScriptHash, out addresses)) { addresses = new List<MonitoredWalletAddress>(); this.addressesByOutputScriptHash.Add(outputScriptHash, addresses); } addresses.Add(new MonitoredWalletAddress(address, monitoredRange)); } if (address.IsMatcher) { this.matcherAddresses.Add(new MonitoredWalletAddress(address, monitoredRange)); } }
//TODO thread safety //TODO need to rescan utxo when addresses are added as well public void AddAddress(IWalletAddress address) { //TODO add to queue, cannot monitor address until chain position moves var startChainPosition = ChainPosition.Fake(); var monitoredRange = new[] { Tuple.Create(startChainPosition, startChainPosition) }.ToList(); foreach (var outputScriptHash in address.GetOutputScriptHashes()) { List <MonitoredWalletAddress> addresses; if (!this.addressesByOutputScriptHash.TryGetValue(outputScriptHash, out addresses)) { addresses = new List <MonitoredWalletAddress>(); this.addressesByOutputScriptHash.Add(outputScriptHash, addresses); } addresses.Add(new MonitoredWalletAddress(address, monitoredRange)); } if (address.IsMatcher) { this.matcherAddresses.Add(new MonitoredWalletAddress(address, monitoredRange)); } }
public MonitoredWalletAddress(IWalletAddress address, List<Tuple<ChainPosition, ChainPosition>> monitoredRanges) { Address = address; MonitoredRanges = monitoredRanges; }
public MonitoredWalletAddress(IWalletAddress address, List <Tuple <ChainPosition, ChainPosition> > monitoredRanges) { Address = address; MonitoredRanges = monitoredRanges; }
private CreationCommitmentResult CreateCommitmentTransaction(IWalletAddress wallet, PubKey lockedPubKey, PubKey unlockedPubKey, PubKey revokePubKey, PubKey multisigPairPubKey, IAsset asset, decimal lockedAmount, decimal unlockedAmount, string channelTr) { var multisig = new BitcoinScriptAddress(wallet.MultisigAddress, _connectionParams.Network); var channel = new Transaction(channelTr); var spendCoin = FindCoin(channel, multisig.ToString(), wallet.RedeemScript, lockedAmount + unlockedAmount, asset); if (spendCoin == null) { throw new BackendException($"Not found output in setup channel with amount {lockedAmount + unlockedAmount}", ErrorCode.NoCoinsFound); } TransactionBuilder builder = new TransactionBuilder(); builder.AddCoins(spendCoin); long additionalBtc = 0; var script = CreateOffchainScript(multisigPairPubKey, revokePubKey, lockedPubKey); var unlockedAddress = unlockedPubKey.GetAddress(_connectionParams.Network); var lockedAddress = script.GetScriptAddress(_connectionParams.Network); if (OpenAssetsHelper.IsBitcoin(asset.Id)) { if (unlockedAmount > 0) { builder.Send(unlockedAddress, new Money(unlockedAmount, MoneyUnit.BTC)); } if (lockedAmount > 0) { builder.Send(lockedAddress, new Money(lockedAmount, MoneyUnit.BTC)); } } else { var sendAmount = ((ColoredCoin)spendCoin).Bearer.Amount; var dustAmount = 0L; var assetId = new BitcoinAssetId(asset.BlockChainAssetId).AssetId; if (unlockedAmount > 0) { builder.SendAsset(unlockedAddress, new AssetMoney(assetId, unlockedAmount, asset.MultiplierPower)); dustAmount += new TxOut(Money.Zero, unlockedAddress.ScriptPubKey).GetDustThreshold(builder.StandardTransactionPolicy.MinRelayTxFee); } if (lockedAmount > 0) { builder.Send(lockedAddress, new AssetMoney(assetId, lockedAmount, asset.MultiplierPower)); dustAmount += new TxOut(Money.Zero, lockedAddress.ScriptPubKey).GetDustThreshold(builder.StandardTransactionPolicy.MinRelayTxFee); } additionalBtc = dustAmount - sendAmount; } var fakeFee = new Money(1, MoneyUnit.BTC); var fakeAmount = additionalBtc + fakeFee; builder.SendFees(fakeFee); _transactionBuildHelper.AddFakeInput(builder, fakeAmount); var tr = builder.BuildTransaction(true); _transactionBuildHelper.RemoveFakeInput(tr); return(new CreationCommitmentResult(tr, lockedAddress.ToString(), script.ToHex())); }