import { utils } from "@project-serum/anchor";
import { PublicKey, SystemProgram } from "@solana/web3.js";

import { TRIBECA_ADDRESSES } from "../../constants";

export * from "./pdaSync";

export const findLockerAddress = async (
  base: PublicKey
): Promise<[PublicKey, number]> => {
  return await PublicKey.findProgramAddress(
    [utils.bytes.utf8.encode("Locker"), base.toBuffer()],
    TRIBECA_ADDRESSES.LockedVoter
  );
};

export const findEscrowAddress = async (
  locker: PublicKey,
  authority: PublicKey
): Promise<[PublicKey, number]> => {
  return await PublicKey.findProgramAddress(
    [
      utils.bytes.utf8.encode("Escrow"),
      locker.toBuffer(),
      authority.toBuffer(),
    ],
    TRIBECA_ADDRESSES.LockedVoter
  );
};

export const findWhitelistAddress = async (
  locker: PublicKey,
  programId: PublicKey,
  owner: PublicKey | null
): Promise<[PublicKey, number]> => {
  return await PublicKey.findProgramAddress(
    [
      utils.bytes.utf8.encode("LockerWhitelistEntry"),
      locker.toBuffer(),
      programId.toBuffer(),
      owner ? owner.toBuffer() : SystemProgram.programId.toBuffer(),
    ],
    TRIBECA_ADDRESSES.LockedVoter
  );
};
