 export type HexString = string;
 export type Hexadecimal = string;
 export type Hash = HexString;
 export type HexNumber = Hexadecimal;
 export type PackedSince = string;
 export type PackedDao = string;

 export type Address = string;

 export type HexadecimalRange = [Hexadecimal, Hexadecimal];

export interface Header {
  timestamp: HexNumber;
  number: HexNumber;
  epoch: HexNumber;
  compactTarget: HexNumber;
  dao: Hash;
  hash: Hash;
  nonce: HexNumber;
  parentHash: Hash;
  proposalsHash: Hash;
  transactionsRoot: Hash;
  extraHash: Hash;
  version: HexNumber;
}

export type HashType = "type" | "data" | "data1" | "data2";
export interface Script {
  codeHash: Hash;
  hashType: HashType;
  args: HexString;
}

export interface OutPoint {
  txHash: Hash;
  index: HexNumber;
}

export type DepType = "depGroup" | "code";
export interface CellDep {
  outPoint: OutPoint;
  depType: DepType;
}

export interface Input {
  previousOutput: OutPoint;
  since: PackedSince;
}

export interface Output {
  capacity: HexString;
  lock: Script;
  type?: Script;
}

export interface WitnessArgs {
  lock?: HexString;
  inputType?: HexString;
  outputType?: HexString;
}
export interface RawTransaction {
  cellDeps: CellDep[];
  hash?: Hash;
  headerDeps: Hash[];
  inputs: Input[];
  outputs: Output[];
  outputsData: HexString[];
  version: HexString;
}
export interface Transaction {
  cellDeps: CellDep[];
  hash?: Hash;
  headerDeps: Hash[];
  inputs: Input[];
  outputs: Output[];
  outputsData: HexString[];
  version: HexNumber;
  witnesses: HexString[];
}

export interface TxStatus {
  blockHash?: Hash;
  status: string;
}

export interface TransactionWithStatus {
  transaction: Transaction;
  txStatus: TxStatus;
}

export interface Cell {
  cellOutput: {
    capacity: HexNumber;
    lock: Script;
    type?: Script;
  };
  data: HexString;
  outPoint?: OutPoint;
  blockHash?: Hash;
  blockNumber?: HexNumber;
}

export interface UncleBlock {
  header: Header;
  proposals: HexString[];
}

export interface Block {
  header: Header;
  transactions: Transaction[];
  uncles: UncleBlock[];
  proposals: HexString[];
}

export interface CellWithStatus {
  cell: {
    data: {
      content: HexString;
      hash: Hash;
    };
    output: Output;
  } | null;
  status: "live" | "unknown";
}

export interface Epoch {
  compactTarget: HexNumber;
  length: HexNumber;
  startNumber: HexNumber;
  number: HexNumber;
}

export interface BlockEconomicState {
  issuance: {
    primary: HexNumber;
    secondary: HexNumber;
  };
  minerReward: {
    primary: HexNumber;
    secondary: HexNumber;
    committed: HexNumber;
    proposal: HexNumber;
  };
  txsFee: HexNumber;
  finalizedAt: Hash;
}

export interface MerkleProof {
  indices: HexNumber[];
  lemmas: Hash[];
}

export interface TransactionProof {
  blockHash: Hash;
  witnessesRoot: Hash;
  proof: MerkleProof;
}

export interface Rational {
  denom: HexNumber;
  numer: HexNumber;
}

export interface ProposalWindow {
  closest: HexNumber;
  farthest: HexNumber;
}

export interface Consensus {
  id: string;
  genesisHash: Hash;
  daoTypeHash?: Hash;
  secp256k1Blake160SighashAllTypeHash?: Hash;
  secp256k1Blake160MultisigAllTypeHash?: Hash;
  initialPrimaryEpochReward: HexNumber;
  secondaryEpochReward: HexNumber;
  maxUnclesNum: HexNumber;
  orphanRateTarget: Rational;
  epochDurationTarget: HexNumber;
  txProposalWindow: ProposalWindow;
  proposerRewardRatio: Rational;
  cellbaseMaturity: HexNumber;
  medianTimeBlockCount: HexNumber;
  maxBlockCycles: HexNumber;
  maxBlockBytes: HexNumber;
  blockVersion: HexNumber;
  txVersion: HexNumber;
  typeIdCodeHash: Hash;
  maxBlockProposalsLimit: HexNumber;
  primaryEpochRewardHalvingInterval: HexNumber;
  permanentDifficultyInDummy: boolean;
}

export interface DryRunResult {
  cycles: HexNumber;
}

export interface NodeAddress {
  address: string;
  score: HexNumber;
}

export interface LocalNodeProtocol {
  id: HexNumber;
  name: string;
  supportVersions: string[];
}

export interface LocalNode {
  version: string;
  nodeId: string;
  active: boolean;
  addresses: NodeAddress[];
  protocols: LocalNodeProtocol[];
  connections: HexNumber;
}

export interface PeerSyncState {
  bestKnownHeaderHash?: HexString;
  bestKnownHeaderNumber?: HexNumber;
  lastCommonHeaderHash?: HexString;
  lastCommonHeaderNumber?: HexNumber;
  unknownHeaderListSize?: HexNumber;
}

export interface RemoteNodeProtocol {
  id: HexNumber;
  version: string;
}

export interface RemoteNode {
  version: string;
  nodeId: string;
  addresses: NodeAddress[];
  isOutbount: boolean;
  connectedDuration: HexNumber;
  lastPingDuration?: HexNumber;
  syncState?: PeerSyncState;
  protocols: RemoteNodeProtocol[];
}

export interface BannedAddr {
  address: string;
  banUntil: HexNumber;
  banReason: string;
  createdAt: HexNumber;
}

export interface SyncState {
  ibd: boolean;
  bestKnownBlockNumber: HexNumber;
  bestKnownBlockTimestamp: HexNumber;
  orphanBlocksCount: HexNumber;
  inflightBlocksCount: HexNumber;
  fastTime: HexNumber;
  normalTime: HexNumber;
  lowTime: HexNumber;
}

export interface TxPoolInfo {
  tipHash: Hash;
  tipNumber: HexNumber;
  pending: HexNumber;
  proposed: HexNumber;
  orphan: HexNumber;
  totalTxSize: HexNumber;
  totalTxCycles: HexNumber;
  minFeeRate: HexNumber;
  lastTxsUpdatedAt: HexNumber;
}

export interface TxPoolIds {
  pending: Hash[];
  proposed: Hash[];
}

export interface TxVerbosity {
  cycles: HexNumber;
  size: HexNumber;
  fee: HexNumber;
  ancestorsSize: HexNumber;
  ancestorsCycles: HexNumber;
  ancestorsCount: HexNumber;
}

export interface TxPoolVerbosity {
  pending: {
    [key: string]: TxVerbosity;
  };
  proposed: {
    [key: string]: TxVerbosity;
  };
}

export type RawTxPool = TxPoolIds | TxPoolVerbosity;

export interface AlertMessage {
  id: HexNumber;
  priority: HexNumber;
  noticeUntil: HexNumber;
  message: string;
}

export interface ChainInfo {
  chain: string;
  medianTime: HexNumber;
  epoch: HexNumber;
  difficulty: HexNumber;
  isInitialBlockDownload: boolean;
  alerts: AlertMessage[];
}

export interface Alert {
  id: HexNumber;
  cancel: HexNumber;
  minVersion?: string;
  maxVersion?: string;
  priority: HexNumber;
  noticeUntil: HexNumber;
  message: string;
  signatures: HexString[];
}

export interface CellbaseWitness {
  lock: Script;
  message: HexString;
}
