protected async Task <string> SendTx(CallData callData, TxParameters txParams) { TransactionInput tx = new TransactionInput { From = CallerAccount.Address, To = ContractAddress, Data = callData.TxData.ToHex(true) }; tx.Gas = txParams == null || !txParams.GasLimit.HasValue ? await _web3.Eth.Transactions.EstimateGas.SendRequestAsync(tx) : new HexBigInteger(txParams.GasLimit.Value); tx.GasPrice = new HexBigInteger(txParams == null || !txParams.GasPrice.HasValue ? Web3.Convert.ToWei(1, Nethereum.Util.UnitConversion.EthUnit.Gwei) : txParams.GasPrice.Value); tx.Nonce = txParams == null || !txParams.Nonce.HasValue ? await GetNonce() : new HexBigInteger(txParams.Nonce.Value); return(await _web3.TransactionManager.SendTransactionAsync(tx)); }
/// <summary> /// Cancel order using this contract caller address as maker /// </summary> /// <param name="order">Order to cancel</param> /// <returns>Task which resolves into tx hash</returns> /// <exception cref="ArgumentNullException">Thrown when <paramref name="order"/> /// is equal to <c>null</c></exception> /// <exception cref="ArgumentException">Thrown when either MakerAddress /// property of <paramref name="order"/> not equal to this contract caller address /// or </exception> public async Task <string> CancelOrderAsync(Order order, TxParameters txParams = null) { order = order ?? throw new ArgumentNullException(nameof(order)); if (order.MakerAddress != CallerAccount.Address) { throw new ArgumentException($"{nameof(order)}.{nameof(Order.MakerAddress)} must " + $"be equal to caller account address", nameof(order)); } if (order.SenderAddress != CallerAccount.Address && order.SenderAddress != EthereumAddress.ZeroAddress) { throw new ArgumentException($"{order}.{nameof(Order.SenderAddress)} must be equal to zero " + $"address or this contract caller address", nameof(order)); } CallData callData = CancelOrderCallData(order, ContractAddress, _web3); return(await SendTx(callData, txParams)); }
/// <summary> /// Fills order, exchanges tokens between Maker and Taker /// </summary> /// <param name="order">0x order</param> /// <param name="takerAssetFillAmount">Amount to fill</param> /// <param name="makerSignature">Maker signature of the order</param> /// <param name="takerSignature">Taker signature of 0x <see cref="Transaction"/></param> /// <param name="txSalt">0x <see cref="Transaction"/> salt</param> /// <param name="txParams">Ethereum transaction parameters</param> /// <returns>Task which resolves into tx hash</returns> /// <exception cref="ArgumentNullException">Any of the arguments is equal to <c>null</c></exception> /// <exception cref="ArgumentException">Thrown when SenderAddress property of <paramref name="order"/> /// not equal to this contract instance caller address</exception> public async Task <string> FillOrderAsync(Order order, BigInteger takerAssetFillAmount, byte[] makerSignature, byte[] takerSignature, BigInteger txSalt, TxParameters txParams = null) { order = order ?? throw new ArgumentNullException(nameof(order)); makerSignature = makerSignature ?? throw new ArgumentNullException(nameof(makerSignature)); takerSignature = takerSignature ?? throw new ArgumentNullException(nameof(takerSignature)); if (order.SenderAddress != CallerAccount.Address) { throw new ArgumentException($"{nameof(order)}.{nameof(Order.SenderAddress)} " + $"must be equal to caller account address", nameof(order)); } CallData callData = FillOrderCallData(order, takerAssetFillAmount, makerSignature, takerSignature, txSalt, ContractAddress, _web3); return(await SendTx(callData, txParams)); }