export type SbtcMiniContractsI = {
  [key: string]: string
}

export type SbtcMiniWalletI = {
  cycle:number, version: string, hashbytes: string, address: string, pubkey: string
}

export type SbtcMiniContractDataI = {
  coordinator?: {
      addr: {
          value: string;
      };
      key: string;
  };
  currentPegWallet: SbtcMiniWalletI;
  nextPegWallet: SbtcMiniWalletI;
  protocolOwner: { stacksAddress: string, value: boolean }
  contractOwner: string;
  currentWindow?: number;
  currentCyclePool?: any;
  tokenUri?: string;
  threshold?: number;
  totalSupply?: number;
  decimals?: number;
  name?: string;
  symbol?: string;
  burnHeight?: number;
};

export type SbtcClarityEvent = {
  _id: string;
  contractId: string;
  eventIndex: number;
  txid: string;
  bitcoinTxid: {
    notification: { type: string; value: string; },
    payload: {
      type: string;
      value: string;
    }
  },
  payloadData: PayloadType;
}
export type PayloadType = {
  sbtcWallet?:string;
  txIndex?: number;
  burnBlockHeight?:number;
  burnBlockTime?:number;
  spendingAddress?: string;
  opcode?: string;
  prinType?: number;
  stacksAddress?: string;
  lengthOfCname?: number;
  cname?: string;
  lengthOfMemo?: number;
  memo?: string;
  revealFee?: number;
  amountSats: number;
  signature?: string;
  dustAmount?: number;
  eventType?: string;
};

export type SbtcContractDataType = {
  coordinator?: { addr: { value: string }, key:string };
  contractId: string;
  contractOwner: string;
  sbtcWalletAddress: string;
  sbtcWalletPublicKey: string;
  numKeys?: number;
  numParties?: number;
  tradingHalted?: boolean;
  tokenUri?: string;
  threshold?: number;
  totalSupply?: number;
  decimals?: number;
  name?: string;
  burnHeight?: number;
}
export type AddressValidationI = {
  isvalid: boolean;
  address: string;
  scriptPubKey: string;
  isscript: boolean;
  iswitness: boolean;
  witness_version: number;
  witness_program: string;
}
export type SbtcBalanceType = {
	cardinal?: string;
	ordinal?: string;
  address:string;
  balance:number;
};
export type BridgeTransactionType = {
  _id?:string;
  eventId?:string;
  network:string
  originator: string;
  uiPayload:DepositPayloadUIType|WithdrawPayloadUIType;
  status: number;
	created: number;
	updated: number;
  tries?: number;
  mode: string;
  requestType:string;
  btcTxid?: string;
  commitTxScript?: CommitmentScriptDataType;
  vout0?: VoutI;
  vout?: VoutI;
}
export type RevealOrReclaim = {
  btcTxid?: string;
  signedPsbtHex?: string;
}
export type CommitmentScriptDataType = {
  address?: string;
  script: string|Uint8Array|undefined;
  paymentType: string;
  redeemScript?: string|Uint8Array;
  witnessScript?: string|Uint8Array;
  wsh?:string;
  leaves?:any;
  tapInternalKey?:string|Uint8Array;
  tapLeafScript?:any;
  tapMerkleRoot?:string|Uint8Array;
  tweakedPubkey?:string|Uint8Array;
}
export type VoutI = {
  scriptpubkey: string;
  scriptpubkey_asm: string;
  scriptpubkey_type: string;
  scriptpubkey_address: string;
  value: number;
}
export type PegInData = {
	requestData?: BridgeTransactionType;
	confirmations?: number;
	burnHeight?: number;
	stacksAddress?: string;
	sbtcWalletAddress: string;
	amount: number,
	revealFee: number;
};

export type CommitKeysI = {
  fromBtcAddress: string;
  sbtcWalletAddress: string;
  revealPub: string;
  reclaimPub: string;
  stacksAddress: string;
};

export type AddressObject = {
  stxAddress: string;
  cardinal: string;
  ordinal: string;
  sBTCBalance: number;
  stxBalance: number;
  stacksTokenInfo?: AddressHiroObject;
  bnsNameInfo?: any;
  cardinalInfo?: AddressMempoolObject;
  ordinalInfo?: AddressMempoolObject;
  btcPubkeySegwit0?: string;
  btcPubkeySegwit1?: string;
};

export type AddressMempoolObject = {
  address: string;
  chain_stats: {
    funded_txo_count: number;
    funded_txo_sum: number;
    spent_txo_count: number;
    spent_txo_sum: number;
    tx_count: number;
  },
  mempool_stats: {
    funded_txo_count: number;
    funded_txo_sum: number;
    spent_txo_count: number;
    spent_txo_sum: number;
    tx_count: number;
  }
}

export type AddressHiroObject = {
    stx: {
      balance: number;
      total_sent: number;
      total_received: number;
      lock_tx_id: string;
      locked:number;
      lock_height: number;
      burnchain_lock_height: number;
      burnchain_unlock_height: number;
    },
    fungible_tokens: any,
    non_fungible_tokens: any
}

export type Message = {
	script: Uint8Array,
	signature?: Uint8Array | string
};
export type UTXO = {
  txid: string;
  vout: number;
  fullout?: {
    scriptpubkey:string;
    scriptpubkey_address:string;
    scriptpubkey_asm:string;
    scriptpubkey_type:string;
    value:number;
  };
  tx: any;
  status: {
    confirmed: boolean;
    block_height?: number;
    block_hash?: string;
    block_time?: number;
  };
  value: number;
};

export type SbtcAlphaEvent = {
  contractId: string;
  eventIndex: string;
  txid: string;
  bitcoinTxid: string;
  payloadData:PayloadType;
}

export type KeySet = {
  deposits: {
    revealPubKey: string;
    reclaimPubKey: string;
    oraclePubKey: string;
  }
}
export type StxSignature = {
  signature: string;
  publicKey: string;
  message: string;
};
export type WrappedPSBT = {
  depositId: string;
  txtype: string;
  broadcastResult?: any;
  signedTransaction?: string;
  signedPsbt?: string;
  stxSignature?: StxSignature;
}
export type ExchangeRate = {
    _id: string;
    currency: string;
    fifteen: number;
    last: number;
    buy: number;
    sell: number;
    symbol: string;
    name: string;
}

export type AuthorisationDataType = {
  signature: string;
  publicKey: string;
  stxAddress:string;
  amountSats:number;
}
export interface PayloadUIType {
  sbtcWalletPublicKey:string
  reclaimPublicKey: string;
  paymentPublicKey: string;
}
export interface DepositPayloadUIType extends PayloadUIType {
  bitcoinAddress:string;
  principal:string;
  amountSats:number;
}
export interface WithdrawPayloadUIType extends DepositPayloadUIType {
  signature?: string|undefined;
}
export type TxMinedParameters = {
  proofElements:Array<any>;
  height: number;
  txIndex: number;
  headerHex:string;
  txIdR:string;
  treeDepth:number;
}

