Route constructor

Route(
  1. List<Pair> pairs,
  2. Currency input, {
  3. Currency? output,
})

Implementation

Route(this.pairs, this.input, {Currency? output}) {
  invariant(pairs.isNotEmpty, 'PAIRS');

  final chainId = pairs.first.chainId;

  invariant(pairs.every((pair) => pair.chainId == chainId), 'CHAIN_IDS');

  invariant(
      (input is Token && pairs[0].involvesToken(input as Token)) ||
          (input == ETHER && pairs[0].involvesToken(Token.WETH[pairs[0].chainId]!)),
      'INPUT');
  if (output != null) {
    invariant(
        (output is Token && pairs[pairs.length - 1].involvesToken(output)) ||
            (output == ETHER &&
                pairs[pairs.length - 1]
                    .involvesToken(Token.WETH[pairs[0].chainId]!)),
        'OUTPUT');
  }

  List<Token> path = [
    input is Token ? (input as Token) : Token.WETH[pairs[0].chainId]!
  ];
  for (int i = 0; i < pairs.length; i++) {
    final currentInput = path[i];
    invariant(
        currentInput == pairs[i].token0 || currentInput == pairs[i].token1,
        'PATH');
    final output =
        currentInput == pairs[i].token0 ? pairs[i].token1 : pairs[i].token0;
    path.add(output);
  }

  pairs = pairs;
  this.path = path;
  midPrice = Price.fromRoute(this);
  input = input;
  this.output = output ?? path[path.length - 1];
}