syntax = "proto3";

package ekubo;

// Copy of tycho.evm.v1.Transaction to be able to implement conversions to/from
// TransactionTrace
message Transaction {
  bytes hash = 1;
  bytes from = 2;
  bytes to = 3;
  uint64 index = 4;
}

message TickDelta {
  bytes pool_id = 1; // bytes32
  int32 tick_index = 2;
  bytes liquidity_net_delta = 3; // int128
  uint64 ordinal = 4;
  Transaction transaction = 5;
}

message TickDeltas { repeated TickDelta deltas = 1; }

message OrderSaleRateDelta {
  bytes pool_id = 1; // bytes32
  uint64 time = 2;
  bytes sale_rate_delta = 3; // int112
  bool is_token1 = 4;
  uint64 ordinal = 5;
  Transaction transaction = 6;
}

message OrderSaleRateDeltas { repeated OrderSaleRateDelta deltas = 1; }

enum ChangeType {
  DELTA = 0;
  ABSOLUTE = 1;
}

message LiquidityChange {
  bytes pool_id = 1; // bytes32
  bytes value = 2;   // uint128 or int128, depending on change_type
  ChangeType change_type = 3;
  uint64 ordinal = 4;
  Transaction transaction = 5;
}

message LiquidityChanges { repeated LiquidityChange changes = 1; }

message SaleRateChange {
  bytes pool_id = 1;      // bytes32
  bytes token0_value = 2; // uint112 or int112, depending on change_type
  bytes token1_value = 3; // uint112 or int112, depending on change_type
  ChangeType change_type = 4;
  uint64 ordinal = 5;
  Transaction transaction = 6;
}

message SaleRateChanges { repeated SaleRateChange changes = 1; }

message PoolDetails {
  bytes token0 = 1; // address
  bytes token1 = 2; // address
  fixed64 fee = 3;
}

message BlockTransactionEvents {
  repeated TransactionEvents block_transaction_events = 1;
  uint64 timestamp = 2; // block timestamp

  message TransactionEvents {
    Transaction transaction = 1;
    repeated PoolLog pool_logs = 2;

    message PoolLog {
      uint64 ordinal = 1;
      bytes pool_id = 2; // bytes32

      oneof event {
        Swapped swapped = 3;
        PositionUpdated position_updated = 4;
        PoolInitialized pool_initialized = 5;
        VirtualOrdersExecuted virtual_orders_executed = 6;
        OrderUpdated order_updated = 7;
      }

      message Swapped {
        bytes delta0 = 1;           // int128
        bytes delta1 = 2;           // int128
        bytes sqrt_ratio_after = 3; // uint192
        bytes liquidity_after = 4;  // uint128
        sint32 tick_after = 5;      // int32
      }

      message PositionUpdated {
        sint32 lower = 1;          // int32
        sint32 upper = 2;          // int32
        bytes liquidity_delta = 3; // int128
        bytes delta0 = 4;          // int128
        bytes delta1 = 5;          // int128
      }

      message PoolInitialized {
        bytes token0 = 1;     // address
        bytes token1 = 2;     // address
        bytes config = 3;     // bytes32
        sint32 tick = 4;      // int32
        bytes sqrt_ratio = 5; // uint192
        Extension extension = 6;

        enum Extension {
          EXTENSION_UNKNOWN = 0;
          EXTENSION_BASE = 1;
          EXTENSION_ORACLE = 2;
          EXTENSION_TWAMM = 3;
          EXTENSION_MEV_RESIST = 4;
        }
      }

      message VirtualOrdersExecuted {
        bytes token0_sale_rate = 1; // int112
        bytes token1_sale_rate = 2; // int112
      }

      message OrderUpdated {
        OrderKey order_key = 1;
        bytes sale_rate_delta = 2; // int112

        message OrderKey {
          bytes sell_token = 1; // address
          bytes buy_token = 2;  // address
          fixed64 fee = 3;
          uint64 start_time = 4; // block timestamp
          uint64 end_time = 5;   // block timestamp
        }
      }
    }
  }
}
