/// <summary>
        /// Creates middleware that adds a nonce to transactions for given public key.
        /// </summary>
        /// <param name="publicKey">Public key for which the nonce should be set.</param>
        /// <param name="client">Client that should be used to retrieve the nonce.</param>
        public NonceTxMiddleware(byte[] publicKey, DAppChainClient client)
        {
            PublicKey = publicKey;
            Client    = client;

            publicKeyHex = CryptoUtils.BytesToHexString(this.PublicKey);
        }
Exemple #2
0
        /// <summary>
        /// Queries the current state of a contract.
        /// </summary>
        /// <typeparam name="T">The expected response type, must be deserializable with Newtonsoft.Json.</typeparam>
        /// <param name="contract">Address of the contract to query.</param>
        /// <param name="queryParams">Query parameters object.</param>
        /// <returns>Deserialized response.</returns>
        public async Task <T> QueryAsync <T>(Address contract, IMessage query = null)
        {
            var    contractAddr = "0x" + CryptoUtils.BytesToHexString(contract.Local.ToByteArray());
            var    queryBytes   = CryptoBytes.ToBase64String(query.ToByteArray());
            var    req          = new QueryJsonRpcRequest("query", contractAddr, queryBytes, Guid.NewGuid().ToString());
            string body         = JsonConvert.SerializeObject(req);

            Logger.Log(LogTag, "Query body: " + body);
            byte[] bodyRaw = new UTF8Encoding().GetBytes(body);
            using (var r = new UnityWebRequest(this.readUrl, "POST"))
            {
                r.uploadHandler   = (UploadHandler) new UploadHandlerRaw(bodyRaw);
                r.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
                r.SetRequestHeader("Content-Type", "application/json");
                await r.SendWebRequest();

                this.HandleError(r);
                if (r.downloadHandler != null && !String.IsNullOrEmpty(r.downloadHandler.text))
                {
                    Logger.Log(LogTag, "Response: " + r.downloadHandler.text);
                    var resp = JsonConvert.DeserializeObject <JsonRpcResponse <T> >(r.downloadHandler.text);
                    return(resp.Result);
                }
            }
            return(default(T));
        }
        private async Task <TReturn> StaticCallAsync <TReturn>(string callInput, FunctionBuilderBase functionBuilder, Func <FunctionBuilderBase, string, TReturn> decodeFunc)
        {
            var result = await this.StaticCallAsyncByteArray(callInput);

            var validResult = result != null && result.Length != 0;

            return(validResult ? decodeFunc(functionBuilder, CryptoUtils.BytesToHexString(result)) : default(TReturn));
        }
        private async Task <TReturn> CallAsync <TReturn>(string callInput, FunctionBuilderBase functionBuilder, Func <FunctionBuilderBase, string, TReturn> decodeFunc)
        {
            var tx     = this.CreateContractMethodCallTx(callInput, VMType.Evm);
            var result = await this.client.CommitTxAsync(tx);

            var validResult = result?.DeliverTx.Data != null && result.DeliverTx.Data.Length != 0;

            return(validResult ? decodeFunc(functionBuilder, CryptoUtils.BytesToHexString(result.DeliverTx.Data)) : default(TReturn));
        }
Exemple #5
0
        /// <summary>
        /// Queries the current state of a contract.
        /// </summary>
        /// <typeparam name="T">The expected response type, must be deserializable with Newtonsoft.Json.</typeparam>
        /// <param name="contract">Address of the contract to query.</param>
        /// <param name="query">Query parameters object.</param>
        /// <returns>Deserialized response.</returns>
        public async Task <T> QueryAsync <T>(Address contract, IMessage query = null)
        {
            var contractAddr = "0x" + CryptoUtils.BytesToHexString(contract.Local.ToByteArray());

            return(await this.readClient.SendAsync <T, QueryParams>("query", new QueryParams
            {
                ContractAddress = contractAddr,
                Params = query.ToByteArray()
            }));
        }
Exemple #6
0
        /// <summary>
        /// Decodes event data into event DTO.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns>Decoded event DTO.</returns>
        /// <see href="https://nethereum.readthedocs.io/en/latest/contracts/calling-transactions-events/"/>
        public T DecodeEventDTO <T>() where T : new()
        {
            EventTopicDecoder eventTopicDecoder = new EventTopicDecoder();

            object[] topicStrings = new object[this.Topics.Length];
            for (int i = 0; i < this.Topics.Length; i++)
            {
                topicStrings[i] = CryptoUtils.BytesToHexString(this.Topics[i]);
            }

            return(eventTopicDecoder.DecodeTopics <T>(topicStrings, CryptoUtils.BytesToHexString(this.Data)));
        }
Exemple #7
0
        public async Task <byte[]> Handle(byte[] txData)
        {
            var key   = CryptoUtils.BytesToHexString(this.PublicKey);
            var nonce = await this.Client.GetNonceAsync(key);

            var tx = new NonceTx
            {
                Inner    = ByteString.CopyFrom(txData),
                Sequence = nonce + 1
            };

            return(tx.ToByteArray());
        }
        private static string AddressStringFromPublicKey(byte[] publicKey)
        {
            if (publicKey == null)
            {
                throw new ArgumentNullException(nameof(publicKey));
            }

            if (publicKey.Length != 32)
            {
                throw new ArgumentException("Expected a 32-byte array", nameof(publicKey));
            }

            return(CryptoUtils.BytesToHexString(CryptoUtils.LocalAddressFromPublicKey(publicKey)));
        }
Exemple #9
0
        /// <summary>
        /// Decodes event data into event DTO.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns>Decoded event DTO.</returns>
        /// <see href="https://nethereum.readthedocs.io/en/latest/contracts/calling-transactions-events/"/>
        public T DecodeEventDTO <T>() where T : new()
        {
            EventTopicDecoder eventTopicDecoder = new EventTopicDecoder();

            return(eventTopicDecoder.DecodeTopics <T>(this.Topics, CryptoUtils.BytesToHexString(this.Data)));
        }
Exemple #10
0
 /// <summary>
 /// Generates a string representation of the address, in the format "chain:0x...".
 /// </summary>
 /// <returns>A string representing the address.</returns>
 public string ToAddressString()
 {
     // TODO: checksum encode the local address bytes like we do in Go
     return(string.Format("{0}:{1}", this.ChainId, "0x" + CryptoUtils.BytesToHexString(this.Local.ToByteArray())));
 }