Beispiel #1
0
        /// <summary>
        /// Calls a smart contract method that mutates state.
        /// The call into the smart contract is accomplished by committing a transaction to the DAppChain.
        /// </summary>
        /// <param name="method">Smart contract method name.</param>
        /// <param name="functionInput">Arguments objects arrays for the smart contract method.</param>
        /// <returns>Nothing.</returns>
        public async Task <BroadcastTxResult> CallAsync(string method, params object[] functionInput)
        {
            FunctionBuilder function  = this.contractBuilder.GetFunctionBuilder(method);
            CallInput       callInput = function.CreateCallInput(functionInput);

            return(await this.CallAsync(callInput.Data));
        }
Beispiel #2
0
        protected async Task <TReturn> CallAsync <TReturn>(TReturn functionOuput, CallInput callInput,
                                                           BlockParameter block)
        {
            var result = await CallAsync(callInput, block);

            return(FunctionBuilderBase.DecodeDTOTypeOutput(functionOuput, result));
        }
        public void ShouldForceCorrectFormatForCallInput()
        {
            var callInput = new CallInput();

            callInput.From = "1";
            callInput.To   = "2";
            callInput.Data = "3";

            Assert.Equal(callInput.From, "0x1");
            Assert.Equal(callInput.To, "0x2");
            Assert.Equal(callInput.Data, "0x3");

            callInput = new CallInput();

            callInput.To   = "2";
            callInput.Data = "3";

            Assert.Equal(callInput.From, null);
            Assert.Equal(callInput.To, "0x2");
            Assert.Equal(callInput.Data, "0x3");

            callInput = new CallInput();
            Assert.Equal(callInput.From, null);
            Assert.Equal(callInput.To, null);
            Assert.Equal(callInput.Data, null);
        }
Beispiel #4
0
        private Protobuf.Transaction CreateContractMethodCallTx(string method, object[] functionInput, out FunctionBuilder functionBuilder)
        {
            functionBuilder = this.contractBuilder.GetFunctionBuilder(method);
            CallInput callInput = functionBuilder.CreateCallInput(functionInput);

            return(this.CreateContractMethodCallTx(callInput.Data, Protobuf.VMType.Evm));
        }
        public async Task <OperationEstimationResult> EstimateTransactionExecutionCost(string from, string signedTrHex)
        {
            Nethereum.Signer.Transaction transaction = new Nethereum.Signer.Transaction(signedTrHex.HexToByteArray());
            var           increasedGas = new HexBigInteger(transaction.GasLimit.ToHexCompact()).Value + 1;
            var           gasLimit     = new HexBigInteger(increasedGas);
            var           gasPrice     = new HexBigInteger(transaction.GasPrice.ToHexCompact());
            string        hexValue     = transaction.Value.ToHexCompact();
            var           value        = new HexBigInteger(!string.IsNullOrEmpty(hexValue) ? hexValue : "0");
            var           to           = transaction.ReceiveAddress.ToHex().EnsureHexPrefix();
            var           data         = transaction?.Data?.ToHex()?.EnsureHexPrefix() ?? "";
            var           callInput    = new CallInput(data, to, from, gasLimit, gasPrice, value);
            HexBigInteger response;

            try
            {
                var callResult = await _web3.Eth.Transactions.Call.SendRequestAsync(callInput);

                response = await _web3.Eth.Transactions.EstimateGas.SendRequestAsync(callInput);
            }
            catch (Exception e)
            {
                response = new HexBigInteger(gasLimit.Value);
            }

            return(new OperationEstimationResult()
            {
                GasAmount = response.Value,
                IsAllowed = response.Value < gasLimit.Value || response.Value == Constants.DefaultTransactionGas
            });
        }
        /// <summary>
        /// 异步 Call 调用 适用于链上调用但不需要共识(通常用constant,view等修饰的合约方法)
        /// </summary>
        /// <param name="contractAddress">合约地址</param>
        /// <param name="abi">合约abi</param>
        /// <param name="callFunctionName">调用方法名称</param>
        /// <returns>返回交易回执</returns>
        public async Task <ReceiptResultDto> CallRequestAsync(string contractAddress, string abi, string callFunctionName, Parameter[] inputsParameters = null, params object[] value)
        {
            CallInput callDto = new CallInput();

            callDto.From = new Account(this._privateKey).Address.ToLower();//address ;
            var contractAbi = new ABIDeserialiser().DeserialiseContract(abi);

            callDto.To    = contractAddress;
            callDto.Value = new HexBigInteger(0);
            var function = contractAbi.Functions.FirstOrDefault(x => x.Name == callFunctionName);

            var sha3Signature = function.Sha3Signature;// "0x53ba0944";

            if (inputsParameters == null)
            {
                callDto.Data = "0x" + sha3Signature;
            }
            else
            {
                var functionCallEncoder = new FunctionCallEncoder();
                var funcData            = functionCallEncoder.EncodeRequest(sha3Signature, inputsParameters,
                                                                            value);
                callDto.Data = funcData;
            }
            var getRequest = new RpcRequest(this._requestId, JsonRPCAPIConfig.Call, new object[] { this._requestObjectId, callDto });
            var result     = await this._rpcClient.SendRequestAsync <ReceiptResultDto>(getRequest);

            //var getRequest = new RpcRequestMessage(this.RequestId, JsonRPCAPIConfig.Call, new object[] { this.RequestObjectId, callDto });
            //var result = HttpUtils.RpcPost<ReceiptResultDto>(BaseConfig.DefaultUrl, getRequest); //同步方法
            return(result);
        }
Beispiel #7
0
        /// <summary>
        /// Estimates the gas limit of sending ether from one address to another.
        /// </summary>
        /// <param name="addressTo"> The address the ether is being sent to. </param>
        /// <param name="value"> The amount of ether being sent (in wei). </param>
        /// <returns> Task which returns the gas limit of sending ether. </returns>
        public static async Task <BigInteger> EstimateEthGasLimit(string addressTo, BigInteger value)
        {
            CallInput      callInput        = new CallInput("", addressTo, new HexBigInteger(value));
            EthEstimateGas estimateGasLimit = new EthEstimateGas(NetworkProvider.GetWeb3().Client);

            return(await estimateGasLimit.SendRequestAsync(callInput));
        }
Beispiel #8
0
        private static IEnumerator SimpleCall(EthCallUnityRequest request, CallInput input)
        {
            var block   = BlockParameter.CreateLatest();
            var waiting = request.SendRequest(input, block);

            return(waiting);
        }
Beispiel #9
0
    public void ReadDateFromContract()
    {
        CreateDefaultAccount();

        HexBigInteger gas      = new HexBigInteger(new BigInteger(this.gas));
        HexBigInteger gasPrice = new HexBigInteger(Nethereum.Util.UnitConversion.Convert.ToWei(this.gasPrice, UnitConversion.EthUnit.Gwei));
        HexBigInteger value    = new HexBigInteger(Nethereum.Util.UnitConversion.Convert.ToWei(transferAmount));

        CallInput input = ContractService.Instance.CreateCallInput("getBalance");

        StartCoroutine(WalletManager.Instance.CallTransaction(input, (UnityRequest <string> result) =>
        {
            if (result.Exception == null)
            {
                // getbalance of contract ,unit: wei
                BigInteger balance = ContractService.Instance.DecodeDate <BigInteger>("getBalance", result.Result);
                decimal ba         = Nethereum.Util.UnitConversion.Convert.FromWei(balance);

                Debug.Log(ba);
            }
            else
            {
                throw new System.InvalidOperationException("Transfer failed");
            }
        }));
    }
Beispiel #10
0
        /// <summary>
        /// Calls a smart contract method that mutates state.
        /// The call into the smart contract is accomplished by committing a transaction to the DAppChain.
        /// </summary>
        /// <param name="functionInput">Input Data Transfer Object for smart contract method.</param>
        /// <returns>Nothing.</returns>
        /// <see href="https://nethereum.readthedocs.io/en/latest/contracts/functiondtos/"/>
        public async Task CallAsync <TInput>(TInput functionInput)
        {
            FunctionBuilder <TInput> function = this.contractBuilder.GetFunctionBuilder <TInput>();
            CallInput callInput = function.CreateCallInput(functionInput);

            await this.CallAsync(callInput.Data);
        }
Beispiel #11
0
        private string CreateContractMethodCallInput(string method, object[] functionInput, out FunctionBuilder functionBuilder)
        {
            functionBuilder = this.contractBuilder.GetFunctionBuilder(method);
            CallInput callInput = functionBuilder.CreateCallInput(functionInput);

            return(callInput.Data);
        }
Beispiel #12
0
        /// <summary>
        /// Calls a smart contract method that mutates state.
        /// The call into the smart contract is accomplished by committing a transaction to the DAppChain.
        /// </summary>
        /// <param name="method">Smart contract method name.</param>
        /// <param name="functionInput">Arguments objects arrays for the smart contract method.</param>
        /// <returns>Nothing.</returns>
        public async Task CallAsync(string method, params object[] functionInput)
        {
            FunctionBuilder function  = this.contractBuilder.GetFunctionBuilder(method);
            CallInput       callInput = function.CreateCallInput(functionInput);

            await this.CallAsync(callInput.Data);
        }
Beispiel #13
0
        public Task <HexBigInteger> EstimateGasAsync(
            CallInput callInput, params object[] functionInput)
        {
            var encodedInput = GetData(functionInput);

            return(EstimateGasFromEncAsync(encodedInput, callInput));
        }
Beispiel #14
0
 protected async Task <HexBigInteger> EstimateGasFromEncAsync(CallInput callInput)
 {
     return
         (await
          TransactionManager.EstimateGasAsync(callInput)
          .ConfigureAwait(false));
 }
Beispiel #15
0
        public void ShouldForceCorrectFormatForCallInput()
        {
            var callInput = new CallInput();

            callInput.From = "1";
            callInput.To   = "2";
            callInput.Data = "3";

            Assert.Equal("0x1", callInput.From);
            Assert.Equal("0x2", callInput.To);
            Assert.Equal("0x3", callInput.Data);

            callInput = new CallInput();

            callInput.To   = "2";
            callInput.Data = "3";

            Assert.Equal(null, callInput.From);
            Assert.Equal("0x2", callInput.To);
            Assert.Equal("0x3", callInput.Data);

            callInput = new CallInput();
            Assert.Equal(null, callInput.From);
            Assert.Equal(null, callInput.To);
            Assert.Equal(null, callInput.Data);
        }
Beispiel #16
0
        public Task <TReturn> CallDeserializingToObjectAsync <TReturn>(
            CallInput callInput, BlockParameter blockParameter, params object[] functionInput) where TReturn : new()
        {
            var encodedInput = GetData(functionInput);

            return(base.CallAsync(new TReturn(), encodedInput, callInput, blockParameter));
        }
Beispiel #17
0
        public async Task <Response <string> > GetEstimatedFee(DonateViewModel model)
        {
            var response  = new Response <string>();
            var test      = model.Amount;
            var callInput = new CallInput()
            {
                From  = model.Address,
                To    = model.Campaign,
                Value = new HexBigInteger(new BigInteger(model.Amount))
            };

            try
            {
                var gas = await _gethClient.Web3.Eth.Transactions.EstimateGas.SendRequestAsync(callInput);

                var gasPrice = await _gethClient.Web3.Eth.GasPrice.SendRequestAsync();

                var gasPriceEth = Web3.Convert.FromWei(gasPrice);

                var estimatedFee = (decimal)gas.Value * gasPriceEth;

                response.Value     = estimatedFee + " Eth";
                response.Succeeded = true;
            }
            catch (Exception ex)
            {
                response.Message   = ex.Message;
                response.Succeeded = false;
            }

            return(response);
        }
Beispiel #18
0
        public Task <TReturn> CallAsync <TReturn>(
            CallInput callInput, BlockParameter blockParameter, params object[] functionInput)
        {
            var encodedInput = GetData(functionInput);

            return(base.CallAsync <TReturn>(encodedInput, callInput, blockParameter));
        }
Beispiel #19
0
        private string CreateContractMethodCallInput <TInput>(TInput functionInput, out FunctionBuilder <TInput> functionBuilder)
        {
            functionBuilder = this.contractBuilder.GetFunctionBuilder <TInput>();
            CallInput callInput = functionBuilder.CreateCallInput(functionInput);

            return(callInput.Data);
        }
Beispiel #20
0
        private Protobuf.Transaction CreateContractMethodCallTx <TInput>(TInput functionInput, out FunctionBuilder <TInput> functionBuilder)
        {
            functionBuilder = this.contractBuilder.GetFunctionBuilder <TInput>();
            CallInput callInput = functionBuilder.CreateCallInput(functionInput);

            return(this.CreateContractMethodCallTx(callInput.Data, Protobuf.VMType.Evm));
        }
Beispiel #21
0
        /// <summary>
        /// Calls a smart contract method that mutates state.
        /// The call into the smart contract is accomplished by committing a transaction to the DAppChain.
        /// </summary>
        /// <param name="functionInput">Input Data Transfer Object for smart contract method.</param>
        /// <returns>Nothing.</returns>
        /// <see href="https://nethereum.readthedocs.io/en/latest/contracts/functiondtos/"/>
        public async Task <BroadcastTxResult> CallAsync <TInput>(TInput functionInput)
        {
            FunctionBuilder <TInput> function = this.contractBuilder.GetFunctionBuilder <TInput>();
            CallInput callInput = function.CreateCallInput(functionInput);

            return(await this.CallAsync(callInput.Data));
        }
Beispiel #22
0
        public async Task <TReturn> CallDeserializingToObjectAsync <TReturn>(
            CallInput callInput, params object[] functionInput) where TReturn : new()
        {
            var encodedInput = GetData(functionInput);

            return(await base.CallAsync <TReturn>(new TReturn(), encodedInput, callInput));
        }
Beispiel #23
0
        public async Task <TReturn> CallAsync <TReturn>(
            CallInput callInput, params object[] functionInput)
        {
            var encodedInput = GetData(functionInput);

            return(await base.CallAsync <TReturn>(encodedInput, callInput));
        }
Beispiel #24
0
 public Task <string> SendRequestAsync(CallInput callInput, object id = null)
 {
     if (callInput == null)
     {
         throw new ArgumentNullException(nameof(callInput));
     }
     return(base.SendRequestAsync(id, callInput, DefaultBlock));
 }
Beispiel #25
0
 public Task <HexBigInteger> SendRequestAsync(CallInput callInput, object id = null)
 {
     if (callInput == null)
     {
         throw new ArgumentNullException(nameof(callInput));
     }
     return(SendRequestAsync(id, callInput));
 }
Beispiel #26
0
 public RpcRequest BuildRequest(CallInput callInput, object id = null)
 {
     if (callInput == null)
     {
         throw new ArgumentNullException(nameof(callInput));
     }
     return(base.BuildRequest(id, callInput));
 }
Beispiel #27
0
 protected Task <string> CallAsync(CallInput callInput, BlockParameter block = null)
 {
     if (block == null)
     {
         block = DefaultBlockParameter;
     }
     return(_contractCall.CallAsync(callInput, block));
 }
        IEnumerator SendRequestCoroutine(CallInput requestParameters, System.Action <UnityRequest <string> > requestCallback)
        {
            var request = new EthCallUnityRequest(requestNode);

            yield return(request.SendRequest(requestParameters, Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest()));

            requestCallback.Invoke(request);
        }
        protected async Task <TReturn> CallAsync <TReturn>(TReturn functionOuput, string encodedFunctionCall,
                                                           CallInput callInput, BlockParameter block)
        {
            callInput.Data = encodedFunctionCall;
            var result = await ethCall.SendRequestAsync(callInput, block).ConfigureAwait(false);

            return(FunctionCallDecoder.DecodeFunctionOutput(functionOuput, result));
        }
Beispiel #30
0
        public Task <HexBigInteger> EstimateGasAsync(TFunctionInput functionInput,
                                                     CallInput callInput)
        {
            var encodedInput = GetData(functionInput);

            callInput.Data = encodedInput;
            return(EstimateGasFromEncAsync(callInput));
        }
        public void ShouldFindExistingCall()
        {
            SetupTestDirectory();
            var saveFileRepository = new CallFileRepository(_directoryName);
            var input = new CallInput { TargetType = "TestTargetType", Method = "TestMethod", Arguments = new object[] { 1234L, null, DateTime.Now } };
            var inputCall = new Call { Input = input, Result = new CallResult { Return = SampleObject.GetSampleObject() } };
            saveFileRepository.SaveCall(inputCall);

            var getFileRepository = new CallFileRepository(_directoryName);
            var outputCall = getFileRepository.GetCall(input);

            Assert.That(outputCall, Is.EqualTo(inputCall));
        }