Trade constructor

Trade(
  1. Route route,
  2. CurrencyAmount amount,
  3. TradeType tradeType
)

Implementation

Trade(this.route, CurrencyAmount amount, this.tradeType) {
  var amounts =
      List<TokenAmount?>.generate(route.path.length, (index) => null);
  var nextPairs = List<Pair?>.generate(route.pairs.length, (index) => null);
  if (tradeType == TradeType.EXACT_INPUT) {
    assert(amount.currency == route.input);

    amounts[0] = wrappedAmount(amount, route.chainId);
    for (var i = 0; i < route.path.length - 1; i++) {
      var pair = route.pairs[i];
      var outputAmountAndNextPair = pair.getOutputAmount(amounts[i]!);
      amounts[i + 1] = outputAmountAndNextPair[0];
      nextPairs[i] = outputAmountAndNextPair[1];
    }
  } else {
    assert(amount.currency == route.output);

    amounts[amounts.length - 1] = wrappedAmount(amount, route.chainId);
    for (var i = route.path.length - 1; i > 0; i--) {
      var pair = route.pairs[i - 1];

      var inputAmountAndNextPair = pair.getInputAmount(amounts[i]!);
      amounts[i - 1] = inputAmountAndNextPair[0];
      nextPairs[i - 1] = inputAmountAndNextPair[1];
    }
  }

  inputAmount = (tradeType == TradeType.EXACT_INPUT
      ? amount
      : route.input == ETHER
          ? CurrencyAmount.ether(amounts.first!.raw)
          : amounts.first)!;

  outputAmount = (tradeType == TradeType.EXACT_OUTPUT
      ? amount
      : route.output == ETHER
          ? CurrencyAmount.ether(amounts[amounts.length - 1]!.raw)
          : amounts[amounts.length - 1]!);

  executionPrice = Price.fromContractor(inputAmount.currency,
      outputAmount.currency, inputAmount.raw, outputAmount.raw);
  priceImpact = computePriceImpact(route.midPrice, inputAmount, outputAmount);
}