Пример #1
0
        private void Create(WasabiSynchronizer synchronizer, Network network, KeyManager keyManager, Func <Uri> ccjHostUriAction, IPEndPoint torSocks5EndPoint)
        {
            Network                      = Guard.NotNull(nameof(network), network);
            KeyManager                   = Guard.NotNull(nameof(keyManager), keyManager);
            CcjHostUriAction             = Guard.NotNull(nameof(ccjHostUriAction), ccjHostUriAction);
            Synchronizer                 = Guard.NotNull(nameof(synchronizer), synchronizer);
            TorSocks5EndPoint            = torSocks5EndPoint;
            CoordinatorFeepercentToCheck = null;

            ExposedLinks = new ConcurrentDictionary <TxoRef, IEnumerable <HdPubKeyBlindedPair> >();
            _running     = 0;
            Cancel       = new CancellationTokenSource();
            _frequentStatusProcessingIfNotMixing = 0;
            State                    = new CcjClientState();
            MixLock                  = new AsyncLock();
            _statusProcessing        = 0;
            DelayedRoundRegistration = null;

            Synchronizer.ResponseArrived += Synchronizer_ResponseArrivedAsync;

            var lastResponse = Synchronizer.LastResponse;

            if (lastResponse != null)
            {
                _ = TryProcessStatusAsync(Synchronizer.LastResponse.CcjRoundStates);
            }
        }
Пример #2
0
        public CcjClient(
            WasabiSynchronizer synchronizer,
            Network network,
            KeyManager keyManager,
            Uri ccjHostUri,
            IPEndPoint torSocks5EndPoint = null)
        {
            Network                      = Guard.NotNull(nameof(network), network);
            KeyManager                   = Guard.NotNull(nameof(keyManager), keyManager);
            CcjHostUri                   = Guard.NotNull(nameof(ccjHostUri), ccjHostUri);
            Synchronizer                 = Guard.NotNull(nameof(synchronizer), synchronizer);
            TorSocks5EndPoint            = torSocks5EndPoint;
            CoordinatorFeepercentToCheck = null;

            ExposedLinks = new ConcurrentDictionary <TxoRef, IEnumerable <HdPubKeyBlindedPair> >();
            _running     = 0;
            Cancel       = new CancellationTokenSource();
            _frequentStatusProcessingIfNotMixing = 0;
            State                    = new CcjClientState();
            MixLock                  = new AsyncLock();
            _statusProcessing        = 0;
            DelayedRoundRegistration = null;

            Synchronizer.ResponseArrived += Synchronizer_ResponseArrivedAsync;
        }
Пример #3
0
        public CcjClient(WasabiSynchronizer synchronizer, Network network, BlindingRsaPubKey coordinatorPubKey, KeyManager keyManager, Uri ccjHostUri, IPEndPoint torSocks5EndPoint = null)
        {
            AccessCache                  = new ConcurrentDictionary <HdPubKey, DateTimeOffset>();
            Network                      = Guard.NotNull(nameof(network), network);
            CoordinatorPubKey            = Guard.NotNull(nameof(coordinatorPubKey), coordinatorPubKey);
            KeyManager                   = Guard.NotNull(nameof(keyManager), keyManager);
            CcjHostUri                   = Guard.NotNull(nameof(ccjHostUri), ccjHostUri);
            Synchronizer                 = Guard.NotNull(nameof(synchronizer), synchronizer);
            TorSocks5EndPoint            = torSocks5EndPoint;
            CoordinatorFeepercentToCheck = null;

            _running = 0;
            Cancel   = new CancellationTokenSource();
            _frequentStatusProcessingIfNotMixing = 0;
            State             = new CcjClientState();
            MixLock           = new AsyncLock();
            _statusProcessing = 0;

            CustomChangeAddresses     = new List <BitcoinAddress>();
            CustomActiveAddresses     = new List <BitcoinAddress>();
            CustomChangeAddressesLock = new object();
            CustomActiveAddressesLock = new object();

            Synchronizer.ResponseArrived += Synchronizer_ResponseArrivedAsync;
        }
Пример #4
0
        public CcjClient(Network network, BlindingRsaPubKey coordinatorPubKey, KeyManager keyManager, Uri ccjHostUri, IPEndPoint torSocks5EndPoint = null)
        {
            Network           = Guard.NotNull(nameof(network), network);
            CoordinatorPubKey = Guard.NotNull(nameof(coordinatorPubKey), coordinatorPubKey);
            KeyManager        = Guard.NotNull(nameof(keyManager), keyManager);
            CcjHostUri        = Guard.NotNull(nameof(ccjHostUri), ccjHostUri);
            TorSocks5EndPoint = torSocks5EndPoint;
            SatoshiClient     = new SatoshiClient(ccjHostUri, torSocks5EndPoint);

            _running = 0;
            Cancel   = new CancellationTokenSource();
            _frequentStatusProcessingIfNotMixing = 0;
            State   = new CcjClientState();
            MixLock = new AsyncLock();

            CustomChangeAddresses     = new List <BitcoinAddress>();
            CustomActiveAddresses     = new List <BitcoinAddress>();
            CustomChangeAddressesLock = new object();
            CustomActiveAddressesLock = new object();
        }
Пример #5
0
        private SmartCoinStatus GetSmartCoinStatus()
        {
            if (Model.IsBanned)
            {
                return(SmartCoinStatus.MixingBanned);
            }

            CcjClientState clientState = Global.ChaumianClient.State;

            if (Model.CoinJoinInProgress)
            {
                foreach (long roundId in clientState.GetAllMixingRounds())
                {
                    CcjClientRound round = clientState.GetSingleOrDefaultRound(roundId);
                    if (round != default)
                    {
                        if (round.CoinsRegistered.Contains(Model))
                        {
                            if (round.State.Phase == CcjRoundPhase.InputRegistration)
                            {
                                return(SmartCoinStatus.MixingInputRegistration);
                            }
                            else if (round.State.Phase == CcjRoundPhase.ConnectionConfirmation)
                            {
                                return(SmartCoinStatus.MixingConnectionConfirmation);
                            }
                            else if (round.State.Phase == CcjRoundPhase.OutputRegistration)
                            {
                                return(SmartCoinStatus.MixingOutputRegistration);
                            }
                            else if (round.State.Phase == CcjRoundPhase.Signing)
                            {
                                return(SmartCoinStatus.MixingSigning);
                            }
                        }
                    }
                }
            }

            if (Model.SpentAccordingToBackend)
            {
                return(SmartCoinStatus.SpentAccordingToBackend);
            }

            if (Model.Confirmed)
            {
                if (Model.CoinJoinInProgress)
                {
                    return(SmartCoinStatus.MixingOnWaitingList);
                }
                else
                {
                    return(SmartCoinStatus.Confirmed);
                }
            }
            else             // Unconfirmed
            {
                if (Model.CoinJoinInProgress)
                {
                    return(SmartCoinStatus.MixingWaitingForConfirmation);
                }
                else
                {
                    return(SmartCoinStatus.Unconfirmed);
                }
            }
        }