Example #1
0
        private void ButtonStart_Click(object sender, EventArgs e)
        {
            try
            {
                var quikFactory = new QuikFactory();
                var options     = QuikClientOptions.GetDefault();

                textBoxLogsWindow.AppendText("Подключаемся к терминалу Quik..." + Environment.NewLine);
                if (checkBoxRemoteHost.Checked)
                {
                    options.Host = IPAddress.Parse(textBoxHost.Text);
                }

                _quik = quikFactory.Create(options);

                //// Отладочный вариант подключения
                //if (checkBoxRemoteHost.Checked) _quik = new Quik(34136, new InMemoryStorage(), textBoxHost.Text);    // инициализируем объект Quik с использованием удаленного IP-адреса терминала
                //else _quik = new Quik(34136, new InMemoryStorage());    // инициализируем объект Quik с использованием локального расположения терминала (по умолчанию)

                var transactionManagerFactory = new TransactionManagerFactory();
                _transactionManager = transactionManagerFactory.Create(_quik, TransactionManagerOptions.GetDefault());
            }
            catch
            {
                textBoxLogsWindow.AppendText("Ошибка инициализации объекта Quik..." + Environment.NewLine);
            }
            if (_quik != null)
            {
                textBoxLogsWindow.AppendText("Экземпляр Quik создан." + Environment.NewLine);
                try
                {
                    textBoxLogsWindow.AppendText("Получаем статус соединения с сервером...." + Environment.NewLine);
                    isServerConnected = _quik.Functions.Service.IsConnectedAsync().Result;
                    if (isServerConnected)
                    {
                        textBoxLogsWindow.AppendText("Соединение с сервером установлено." + Environment.NewLine);
                        buttonRun.Enabled   = true;
                        buttonStart.Enabled = false;
                    }
                    else
                    {
                        textBoxLogsWindow.AppendText("Соединение с сервером НЕ установлено." + Environment.NewLine);
                        buttonRun.Enabled   = false;
                        buttonStart.Enabled = true;
                    }
                    // для отладки
                    //Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
                    //Trace.Listeners.Add(new TextWriterTraceListener("TraceLogging.log"));
                    // для отладки
                }
                catch
                {
                    textBoxLogsWindow.AppendText("Неудачная попытка получить статус соединения с сервером." + Environment.NewLine);
                }
            }
        }
Example #2
0
        public DapperConnection(string connStr)
        {
            var dapperTransactionManager = TransactionManagerFactory.GetOrSetTransactionManager(() =>
            {
                return(new DapperTransactionManager(new SqlConnection(connStr)));
            }) as DapperTransactionManager;

            this.connection  = dapperTransactionManager.connectionHolder.Connection;
            this.transaction = dapperTransactionManager.connectionHolder.Transaction;
        }
Example #3
0
        public async Task <UInt256> ExecuteAsync(ExpressWalletAccount account, Script script, decimal additionalGas = 0)
        {
            var signers = new[] { new Signer {
                                      Scopes = WitnessScope.CalledByEntry, Account = account.AsUInt160()
                                  } };
            var factory = new TransactionManagerFactory(rpcClient);
            var tm      = await factory.MakeTransactionAsync(script, signers).ConfigureAwait(false);

            var tx = await tm
                     .AddGas(additionalGas)
                     .AddSignatures(chain, account)
                     .SignAsync()
                     .ConfigureAwait(false);

            return(await SubmitTransactionAsync(tx).ConfigureAwait(false));
        }
Example #4
0
        public async Task <UInt256> ExecuteAsync(Wallet wallet, UInt160 accountHash, WitnessScope witnessScope, Script script, decimal additionalGas = 0)
        {
            var signers = new[] { new Signer {
                                      Account = accountHash, Scopes = witnessScope
                                  } };
            var factory = new TransactionManagerFactory(rpcClient);
            var tm      = await factory.MakeTransactionAsync(script, signers).ConfigureAwait(false);

            if (additionalGas > 0.0m)
            {
                tm.Tx.SystemFee += (long)additionalGas.ToBigInteger(NativeContract.GAS.Decimals);
            }

            var account = wallet.GetAccount(accountHash) ?? throw new Exception();

            if (account.Contract.Script.IsMultiSigContract())
            {
                var signatureCount  = account.Contract.ParameterList.Length;
                var multiSigWallets = chain.GetMultiSigWallets(ProtocolSettings, accountHash);
                if (multiSigWallets.Count < signatureCount)
                {
                    throw new InvalidOperationException();
                }

                var publicKeys = multiSigWallets
                                 .Select(w => (w.GetAccount(accountHash)?.GetKey() ?? throw new Exception()).PublicKey)
                                 .ToArray();

                for (var i = 0; i < signatureCount; i++)
                {
                    var key = multiSigWallets[i].GetAccount(accountHash)?.GetKey() ?? throw new Exception();
                    tm.AddMultiSig(key, signatureCount, publicKeys);
                }
            }
            else
            {
                tm.AddSignature(account.GetKey() ?? throw new Exception());
            }

            var tx = await tm.SignAsync().ConfigureAwait(false);

            return(await rpcClient.SendRawTransactionAsync(tx).ConfigureAwait(false));
        }
Example #5
0
        protected void SetUpQuik()
        {
            QuikFactory = new QuikFactory();

            var quikClientOptions = QuikClientOptions.GetDefault();

            Quik = QuikFactory.Create(quikClientOptions);

            Quik.Client.Start();

            var pendingResultContainer = new PendingResultContainer();
            var eventTypeProvider      = new EventTypeProvider();

            Serializer = new QuikJsonSerializer(pendingResultContainer, eventTypeProvider);

            var transactionManagerFactory = new TransactionManagerFactory();

            TransactionManager = transactionManagerFactory.Create(Quik, TransactionManagerOptions.GetDefault());
        }
Example #6
0
        private void buttonConnect_Click(object sender, EventArgs e)
        {
            try
            {
                textBoxLogs.AppendText("Подключаемся к терминалу Quik..." + Environment.NewLine);

                var quikFactory = new QuikFactory();
                var options     = QuikClientOptions.GetDefault();
                _quik = quikFactory.Create(options);    // инициализируем объект Quik
                //_quik = new Quik(34136, new InMemoryStorage());    // отладочный вариант

                var transactionManagerFactory = new TransactionManagerFactory();
                _transactionManager = transactionManagerFactory.Create(_quik, TransactionManagerOptions.GetDefault());
            }
            catch
            {
                textBoxLogs.AppendText("Ошибка инициализации объекта Quik." + Environment.NewLine);
            }
            if (_quik != null)
            {
                textBoxLogs.AppendText("Экземпляр Quik создан." + Environment.NewLine);
                try
                {
                    textBoxLogs.AppendText("Получаем статус соединения с сервером..." + Environment.NewLine);
                    isServerConnected = _quik.Functions.Service.IsConnectedAsync().Result;
                    if (isServerConnected)
                    {
                        textBoxLogs.AppendText("Соединение с сервером установлено." + Environment.NewLine);
                        buttonStartStop.Enabled = true;
                    }
                    else
                    {
                        textBoxLogs.AppendText("Соединение с сервером НЕ установлено." + Environment.NewLine);
                        buttonStartStop.Enabled = false;
                    }
                }
                catch
                {
                    textBoxLogs.AppendText("Неудачная попытка получить статус соединения с сервером." + Environment.NewLine);
                }
            }
        }
        static async Task Main(string[] args)
        {
            var rpcClient = new RpcClient(new Uri($"http://localhost:{RpcPort}"));

            var version = await rpcClient.GetVersionAsync().ConfigureAwait(false);

            var settings = ProtocolSettings.Default with
            {
                Network        = version.Protocol.Network,
                AddressVersion = version.Protocol.AddressVersion
            };

            var contracts = await rpcClient.ListContractsAsync().ConfigureAwait(false);

            var contract = contracts.Single(t => t.manifest.Name == "DevHawk.Registrar");

            var program = new Program(settings, contract.hash);

            var domainArg = new Argument <string>("domain");
            var queryCmd  = new Command("query")
            {
                domainArg
            };

            queryCmd.SetHandler((string domain) => program.QueryAsync(domain), domainArg);

            var ownerArg      = new Argument <string>("owner");
            var privateKeyArg = new Argument <string>("private-key");
            var registerCmd   = new Command("register")
            {
                domainArg, ownerArg, privateKeyArg
            };

            registerCmd.SetHandler(
                (string domain, string owner, string privateKey) =>
                program.RegisterAsync(domain, owner, privateKey),
                domainArg, ownerArg, privateKeyArg);

            var rootCmd = new RootCommand()
            {
                queryCmd, registerCmd,
            };

            await rootCmd.InvokeAsync(args).ConfigureAwait(false);
        }

        Task <int> QueryAsync(string domain)
        {
            return(HandleErrors(async() =>
            {
                var domainParam = new ContractParameter(ContractParameterType.String)
                {
                    Value = domain
                };
                using var builder = new ScriptBuilder();
                builder.EmitDynamicCall(contractHash, "query", domainParam);

                var rpcClient = new RpcClient(new Uri($"http://localhost:{RpcPort}"), protocolSettings: settings);
                var result = await rpcClient.InvokeScriptAsync(builder.ToArray()).ConfigureAwait(false);

                if (!string.IsNullOrEmpty(result.Exception))
                {
                    throw new Exception(result.Exception);
                }

                if (result.Stack.Length != 1)
                {
                    throw new Exception($"Unexpected result stack length {result.Stack.Length}");
                }

                var ownerScriptHash = ToUInt160(result.Stack[0]);
                var text = ownerScriptHash.Equals(UInt160.Zero)
                    ? $"query: {domain} unowned"
                    : $"query: {domain} owned by {ownerScriptHash.ToAddress(settings.AddressVersion)}";

                await Console.Out.WriteLineAsync(text).ConfigureAwait(false);
            }));
        }

        Task <int> RegisterAsync(string domain, string owner, string privateKey)
        {
            return(HandleErrors(async() =>
            {
                var keyPair = new KeyPair(Convert.FromHexString(privateKey));

                var ownerAccount = owner.ToScriptHash(settings.AddressVersion);
                var domainParam = new ContractParameter(ContractParameterType.String)
                {
                    Value = domain
                };
                var ownerParam = new ContractParameter(ContractParameterType.Hash160)
                {
                    Value = ownerAccount
                };
                using var builder = new ScriptBuilder();
                builder.EmitDynamicCall(contractHash, "register", domainParam, ownerParam);

                var rpcClient = new RpcClient(new Uri($"http://localhost:{RpcPort}"), protocolSettings: settings);
                var factory = new TransactionManagerFactory(rpcClient);
                var signers = new[] { new Signer {
                                          Account = ownerAccount, Scopes = WitnessScope.CalledByEntry
                                      } };
                var tm = await factory.MakeTransactionAsync(builder.ToArray(), signers).ConfigureAwait(false);
                tm.AddSignature(keyPair);
                var tx = await tm.SignAsync().ConfigureAwait(false);
                var txHash = await rpcClient.SendRawTransactionAsync(tx).ConfigureAwait(false);

                await Console.Out.WriteLineAsync($"register: {domain} to {owner} (tx hash: {txHash})").ConfigureAwait(false);
            }));
        }