// Mirrors the Solidity `ProviderKind` enum in
// `Yggdrasil-VirtualMachine/src/flashloan/FlashloanLeg.sol`. The numeric
// values are wire format; the Rust EVM backend consumes them in
// `executeWithFlashloan(adapter, legs, programBytes)`. Drift between this
// file and the Solidity source is a bug.

export const PROVIDER_KIND = {
  AAVE_V3: 0,
  ERC3156: 1,
  BALANCER_V2: 2,
  MORPHO_BLUE: 3,
} as const;

export const providerKindNames = [
  "aave-v3",
  "erc3156",
  "balancer-v2",
  "morpho-blue",
] as const;

export type ProviderKindName = (typeof providerKindNames)[number];

export const providerKindByName: Record<ProviderKindName, number> = {
  "aave-v3": PROVIDER_KIND.AAVE_V3,
  erc3156: PROVIDER_KIND.ERC3156,
  "balancer-v2": PROVIDER_KIND.BALANCER_V2,
  "morpho-blue": PROVIDER_KIND.MORPHO_BLUE,
};

// The fully-narrowed JSON shape of a `flashloan` MaterialiserInput once it
// has crossed from untrusted Flow JSON through structural validation. The
// literal `kind: "flashloan"` discriminates inside the `MaterialiserInput`
// union; `providerKind` and `amount` are the two flashloan-specific fields.
// `amount` is the wire form (decimal-integer string); the flashloan
// materialiser's `configSchema` (see compose-builtins/materialisers/flashloan)
// validates the shape before any consumer reads it.
export interface FlashloanMaterialiserInput {
  readonly kind: "flashloan";
  readonly providerKind: ProviderKindName;
  readonly amount: string;
}
