Пример #1
0
        public string GetData(string contractByteCode, string abi, params object[] values)
        {
            var contract = _abiDeserialiser.DeserialiseContract(abi);

            return(_constructorCallEncoder.EncodeRequest(contractByteCode,
                                                         contract.Constructor.InputParameters, values));
        }
Пример #2
0
        private TransactionInput BuildTransaction(string abi, string contractByteCode, string from, HexBigInteger gas, object[] values)
        {
            var contract    = abiDeserialiser.DeserialiseContract(abi);
            var encodedData = constructorCallEncoder.EncodeRequest(contractByteCode,
                                                                   contract.Constructor.InputParameters, values);
            var transaction = new TransactionInput(encodedData, gas, from);

            return(transaction);
        }
Пример #3
0
        public Task <string> SendRequestAsync(string abi, string contractByteCode, string from, HexBigInteger gas,
                                              params object[] values)
        {
            var contract    = abiDeserialiser.DeserialiseContract(abi);
            var encodedData = constructorCallEncoder.EncodeRequest(contractByteCode,
                                                                   contract.Constructor.InputParameters, values);

            return(ethSendTransaction.SendRequestAsync(new TransactionInput(encodedData, gas, @from)));
        }
Пример #4
0
        /// <summary>
        ///异步 发送交易,返回交易回执
        /// </summary>
        /// <param name="abi">合约abi</param>
        /// <param name="contractAddress">合约地址</param>
        /// <param name="functionName">合约请求调用方法名称</param>
        /// <param name="inputsParameters">方法对应的 参数</param>
        /// <param name="value">请求参数值</param>
        /// <returns>交易回执</returns>
        public async Task <ReceiptResultDto> SendTranscationWithReceiptAsync(string abi, string contractAddress, string functionName, Parameter[] inputsParameters, params object[] value)
        {
            ReceiptResultDto receiptResult = new ReceiptResultDto();

            var des                 = new ABIDeserialiser();
            var contract            = des.DeserialiseContract(abi);
            var function            = contract.Functions.FirstOrDefault(x => x.Name == functionName);
            var sha3Signature       = function.Sha3Signature;// "0x53ba0944";
            var functionCallEncoder = new FunctionCallEncoder();
            var result              = functionCallEncoder.EncodeRequest(sha3Signature, inputsParameters,
                                                                        value);
            var blockNumber = await GetBlockNumberAsync();

            var transDto = BuildTransactionParams(result, blockNumber, contractAddress);
            var tx       = BuildRLPTranscation(transDto);

            tx.Sign(new EthECKey(this._privateKey.HexToByteArray(), true));
            var txHash = await SendRequestAysnc <string>(tx.Data, tx.Signature);

            if (txHash != null)
            {
                receiptResult = await GetTranscationReceiptAsync(txHash);

                if (receiptResult == null)
                {
                    throw new Exception("txHash != null 的时候报错了:" + receiptResult.ToJson());
                }
            }
            return(receiptResult);
        }
Пример #5
0
        /// <summary>
        /// 异步 通用合约部署,只返回交易Hash
        /// </summary>
        /// <param name="binCode">合约内容</param>
        /// <returns>交易Hash</returns>
        public async Task <string> DeployContractAsync(string binCode, string abi = null, params object[] values)
        {
            var blockNumber = await GetBlockNumberAsync();

            var resultData = "";
            ConstructorCallEncoder _constructorCallEncoder = new ConstructorCallEncoder();

            if (values == null || values.Length == 0)
            {
                resultData = _constructorCallEncoder.EncodeRequest(binCode, "");
            }

            var des      = new ABIDeserialiser();
            var contract = des.DeserialiseContract(abi);

            if (contract.Constructor == null)
            {
                throw new Exception(
                          "Parameters supplied for a constructor but ABI does not contain a constructor definition");
            }
            resultData = _constructorCallEncoder.EncodeRequest(binCode,
                                                               contract.Constructor.InputParameters, values);

            var transParams = BuildTransactionParams(resultData, blockNumber, "");
            var tx          = BuildRLPTranscation(transParams);

            tx.Sign(new EthECKey(this._privateKey.HexToByteArray(), true));
            var result = await SendRequestAysnc <string>(tx.Data, tx.Signature);

            return(result);
        }
Пример #6
0
        /// <summary>
        ///同步 发送交易,返回交易回执
        /// </summary>
        /// <param name="abi">合约abi</param>
        /// <param name="contractAddress">合约地址</param>
        /// <param name="functionName">合约请求调用方法名称</param>
        /// <param name="inputsParameters">方法对应的 参数</param>
        /// <param name="value">请求参数值</param>
        /// <returns>交易回执</returns>
        public ReceiptResultDto SendTranscationWithReceipt(string abi, string contractAddress, string functionName, Parameter[] inputsParameters, params object[] value)
        {
            ReceiptResultDto receiptResult = new ReceiptResultDto();

            var des      = new ABIDeserialiser();
            var contract = des.DeserialiseContract(abi);

            var function            = contract.Functions.FirstOrDefault(x => x.Name == functionName);
            var sha3Signature       = function.Sha3Signature;// "0x53ba0944";
            var functionCallEncoder = new FunctionCallEncoder();
            var result = functionCallEncoder.EncodeRequest(sha3Signature, inputsParameters,
                                                           value);
            var blockNumber = GetBlockNumber();
            var transDto    = BuildTransactionParams(result, blockNumber, contractAddress);
            var tx          = BuildRLPTranscation(transDto);

            tx.Sign(new EthECKey(this._privateKey.HexToByteArray(), true));
            var txHash = SendRequest <object>(tx.Data, tx.Signature);

            if (txHash != null)
            {
                receiptResult = GetTranscationReceipt(txHash.ToString());
            }
            return(receiptResult);
        }
Пример #7
0
        /// <summary>
        /// 同步 通用合约部署,只返回交易Hash
        /// </summary>
        /// <param name="binCode">合约内容</param>
        /// <returns>交易Hash</returns>
        public string DeployContract(string binCode, string abi = null, params object[] values)
        {
            var blockNumber = GetBlockNumber();
            var resultData  = "";
            ConstructorCallEncoder _constructorCallEncoder = new ConstructorCallEncoder();

            var des      = new ABIDeserialiser();
            var contract = des.DeserialiseContract(abi);

            if (contract.Constructor != null)
            {
                if (values != null)
                {
                    resultData = _constructorCallEncoder.EncodeRequest(binCode,
                                                                       contract.Constructor.InputParameters, values);
                }
                else
                {
                    resultData = _constructorCallEncoder.EncodeRequest(binCode, "");
                }
            }
            else
            {
                resultData = binCode;
            }
            var transParams = BuildTransactionParams(resultData, blockNumber, "");
            var tx          = BuildRLPTranscation(transParams);

            tx.Sign(new EthECKey(this._privateKey.HexToByteArray(), true));
            var result = SendRequest <object>(tx.Data, tx.Signature);

            return(Convert.ToString(result));
        }
Пример #8
0
        private async Task <EventABI[]> GetEventAbisAsync(IEventSubscriptionDto eventSubscription)
        {
            if (eventSubscription.ContractId == null)
            {
                return(null);
            }

            if (!eventSubscription.CatchAllContractEvents && eventSubscription.EventSignatures.Count == 0)
            {
                return(null);
            }

            var contractDto = await SubscriberContractRepository.GetAsync(eventSubscription.SubscriberId, eventSubscription.ContractId.Value).ConfigureAwait(false);

            ContractABI contractAbi = contractDto.Abi == null ? null : _abiDeserializer.DeserialiseContract(contractDto.Abi);

            if (contractAbi == null)
            {
                return(null);
            }

            if (eventSubscription.CatchAllContractEvents)
            {
                return(contractAbi.Events);
            }

            return(contractAbi.Events.Where(e => eventSubscription.EventSignatures.Contains(e.Sha3Signature)).ToArray());
        }
        public string ContractGen(string abi, string contractName, string nameSpace)
        {
            contractName = MakeFirstCharUpper(contractName);
            var des         = new ABIDeserialiser();
            var contract    = des.DeserialiseContract(abi);
            var operations  = EventsGen(contract) + FunctionsGen(contract);
            var genContract = string.Format(ContractTemplate, abi.Replace("\"", "\"\""), contractName, operations);

            return(string.Format(NameSpaceTemplate, nameSpace, genContract));
        }
Пример #10
0
        public ServiceModel(string abi, string byteCode, string contractName = DEFAULT_CONTRACTNAME,
                            string namespaceName = DEFAULT_NAMESPACE)
        {
            ContractName = CapitaliseFirstChar(contractName);
            Namespace    = CapitaliseFirstChar(namespaceName);
            Abi          = abi;
            ByteCode     = byteCode;
            var des = new ABIDeserialiser();

            Contract = des.DeserialiseContract(abi);
        }
Пример #11
0
        public CommonModel(string abi, string byteCode,
                           string namespaceName = DEFAULT_NAMESPACE)
        {
            utils       = new Utils();
            GlobalNames = new GlobalNames();
            Namespace   = Utils.CapitaliseFirstChar(namespaceName);
            Abi         = abi;
            ByteCode    = byteCode;
            var des = new ABIDeserialiser();

            Contract = des.DeserialiseContract(abi);
        }
Пример #12
0
        public Event DecodeTransactionLog(
            TransactionLog transactionLog)
        {
            var abiObject = _abiDeserializer.DeserialiseContract(transactionLog.Abi).Events[0];
            // ReSharper disable once CoVariantArrayConversion
            var parameters = _eventTopicDecoder.DecodeDefaultTopics(abiObject, transactionLog.Topics, transactionLog.Data);

            return(new Event
            {
                EventName = abiObject.Name,
                EventSignature = $"0x{abiObject.Sha3Signature}",
                LogIndex = transactionLog.LogIndex,
                Parameters = parameters.Select(x => new EventParameter
                {
                    ParameterName = x.Parameter.Name,
                    ParameterOrder = x.Parameter.Order,
                    ParameterType = x.Parameter.Type,
                    ParameterValue = StringifyParameter(x)
                }).ToList(),
                ParametersJson = SerializeParameters(parameters),
                TransactionHash = transactionLog.TransactionHash,
                BlockTimestamp = transactionLog.BlockTimestamp
            });
        }
Пример #13
0
        public virtual void ShouldDeserializeContract()
        {
            string abi = @"[{""constant"":false,""inputs"":[{""name"":""a"",""type"":""uint256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""uint256""}],""type"":""function""},{""constant"":false,""inputs"":[{""name"":""a"",""type"":""uint256""},{""name"":""to"",""type"":""address""}],""name"":""other"",""outputs"":[{""name"":""d"",""type"":""uint256""}],""type"":""function""}]";

            var des      = new ABIDeserialiser();
            var contract = des.DeserialiseContract(abi);
            var function = contract.Functions.FirstOrDefault(x => x.Name == "multiply");

            Assert.NotNull(function);
            Assert.False(function.Constant);
            var param = function.InputParameters.FirstOrDefault(x => x.Name == "a");

            Assert.NotNull(param);
            Assert.Equal(param.Type, "uint256");
            Assert.Equal("c6888fa1", function.Sha3Signature);
            Assert.Equal("ea6ace3d", contract.Functions[1].Sha3Signature);
        }
Пример #14
0
        public async Task <ContractABIRegistrationResult> RegisterContractABIAsync(
            string contractABI)
        {
            using (_log.BeginScope($"{nameof(RegisterContractABIAsync)}-{Guid.NewGuid()}"))
            {
                #region Logging

                _log.Debug("Registering contract ABI.");

                #endregion

                try
                {
                    // Currently it's an easiest way to validate input.
                    _abiDeserializer.DeserialiseContract(contractABI);
                }
                catch (Exception e)
                {
                    #region Logging

                    _log.Error("Failed to register a contract ABI. Provided data is not properly formatted.", e);

                    #endregion

                    return(new ContractABIRegistrationResult
                    {
                        Error = ContractABIRegistrationError.InvalidInputFormat
                    });
                }

                var abiJson = JArray.Parse(contractABI);

                foreach (var item in abiJson.Select(x => $"[{x}]"))
                {
                    var abiObject = _abiDeserializer.DeserialiseContract(item);

                    if (abiObject.Events.Length == 1)
                    {
                        var eventAbi = abiObject.Events[0];

                        await _abiRepository.SaveABIAsync(new ABI
                        {
                            Abi       = item,
                            Name      = eventAbi.Name,
                            Signature = $"0x{eventAbi.Sha3Signature}",
                            Type      = ABIType.Event
                        });

                        #region Logging

                        _log.Info
                        (
                            "Event ABI  has been registered.",
                            new { eventAbi.Name, Signature = eventAbi.Sha3Signature, Type = ABIType.Event }
                        );

                        #endregion
                    }
                    else if (abiObject.Functions.Length == 1)
                    {
                        var functionAbi = abiObject.Functions[0];

                        if (!functionAbi.Constant)
                        {
                            await _abiRepository.SaveABIAsync(new ABI
                            {
                                Abi       = item,
                                Name      = functionAbi.Name,
                                Signature = $"0x{functionAbi.Sha3Signature}",
                                Type      = ABIType.Event
                            });

                            #region Logging

                            _log.Info
                            (
                                "Function call ABI has been registered.",
                                new { functionAbi.Name, Signature = functionAbi.Sha3Signature, Type = ABIType.FunctionCall }
                            );

                            #endregion
                        }
                        else
                        {
                            #region Logging

                            _log.Debug
                            (
                                "Read-only function call ABI has been skipped.",
                                new { functionAbi.Name, Signature = functionAbi.Sha3Signature, Type = ABIType.FunctionCall }
                            );

                            #endregion
                        }
                    }
                }

                return(new ContractABIRegistrationResult());
            }
        }