import type { Address } from "viem";
import { abstract, abstractTestnet } from "viem/chains";

// AA smart contract deployment
const SMART_ACCOUNT_FACTORY_ADDRESS =
  "0x9B947df68D35281C972511B3E7BC875926f26C1A" as const;

// AA wallet validator contract deployment
const EOA_VALIDATOR_ADDRESS = "0x74b9ae28EC45E3FA11533c7954752597C3De3e7A";

const SESSION_KEY_VALIDATOR_ADDRESS =
  "0x34ca1501FAE231cC2ebc995CE013Dbe882d7d081";

const CONTRACT_DEPLOYER_ADDRESS =
  "0x0000000000000000000000000000000000008006" as const;

const AGW_REGISTRY_ADDRESS =
  "0xd5E3efDA6bB5aB545cc2358796E96D9033496Dda" as const;

/** `function addModule(bytes moduleAndData) external` */
const ADD_MODULE_SELECTOR = "0xd3bdf4b5" as const;

/** `function createSession(SessionLib.SessionSpec memory sessionSpec) external` */
const CREATE_SESSION_SELECTOR = "0x5a0694d2" as const;

/** `function batchCall((address,bool,uint256,bytes)[]) external` */
const BATCH_CALL_SELECTOR = "0x8f0273a9" as const;

/** `error INSUFFICIENT_FUNDS()` */
const INSUFFICIENT_BALANCE_SELECTOR = "0xe7931438" as const;

const CANONICAL_DELEGATE_REGISTRY_ADDRESS =
  "0x0000000059A24EB229eED07Ac44229DB56C5d797";

const CANONICAL_EXCLUSIVE_DELEGATE_RESOLVER_ADDRESS =
  "0x0000000078CC4Cc1C14E27c0fa35ED6E5E58825D";

const AGW_LINK_DELEGATION_RIGHTS =
  "0xc10dcfe266c1f71ef476efbd3223555750dc271e4115626b";

const NON_EXPIRING_DELEGATION_RIGHTS = `${AGW_LINK_DELEGATION_RIGHTS}000000ffffffffff`;

const BASE_GAS_PER_PUBDATA_BYTE = 800n;

const BRIDGEHUB_ADDRESS: Record<number, Address> = {
  [abstractTestnet.id]: "0x35A54c8C757806eB6820629bc82d90E056394C92",
  [abstract.id]: "0x303a465b659cbb0ab36ee643ea362c509eeb5213",
};

const SESSION_KEY_POLICY_REGISTRY_ADDRESS: Address =
  "0xfD20b9d7A406e2C4f5D6Df71ABE3Ee48B2EccC9F";

const FEATURE_FLAG_REGISTRY_ADDRESS: Address =
  "0xb5023a9F3e948e3A4f9DBA97118EEE801fA4e265";

export {
  ADD_MODULE_SELECTOR,
  AGW_LINK_DELEGATION_RIGHTS,
  AGW_REGISTRY_ADDRESS,
  BASE_GAS_PER_PUBDATA_BYTE,
  BATCH_CALL_SELECTOR,
  BRIDGEHUB_ADDRESS,
  CANONICAL_DELEGATE_REGISTRY_ADDRESS,
  CANONICAL_EXCLUSIVE_DELEGATE_RESOLVER_ADDRESS,
  CONTRACT_DEPLOYER_ADDRESS,
  CREATE_SESSION_SELECTOR,
  EOA_VALIDATOR_ADDRESS,
  FEATURE_FLAG_REGISTRY_ADDRESS,
  INSUFFICIENT_BALANCE_SELECTOR,
  NON_EXPIRING_DELEGATION_RIGHTS,
  SESSION_KEY_POLICY_REGISTRY_ADDRESS,
  SESSION_KEY_VALIDATOR_ADDRESS,
  SMART_ACCOUNT_FACTORY_ADDRESS,
};
