import { PublicKey, Signer, Transaction, TransactionInstruction, VersionedTransaction } from "@solana/web3.js"; import { Mint, TransferFeeConfig } from "@solana/spl-token"; import { ExecuteParam, TxBuilder } from "../common/txTool/txTool"; import { TokenAmount } from "../module/amount"; import BN from "bn.js"; export type SignAllTransactions = | ((transaction: T[]) => Promise) | undefined; export interface MakeTransaction> { builder: TxBuilder; signers: Signer[]; transaction: Transaction; instructionTypes: string[]; execute: () => Promise<{ txId: string; signedTx: Transaction }>; extInfo: T; } export interface MakeV0Transaction> { builder: TxBuilder; signers: Signer[]; transaction: VersionedTransaction; instructionTypes: string[]; execute: () => Promise; extInfo: T; } export interface MakeMultiTransaction { builder: TxBuilder; signers: Signer[][]; transactions: Transaction[]; instructionTypes: string[]; execute: (params?: ExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[]; }>; extInfo: Record; } export interface InstructionReturn { instruction: TransactionInstruction; instructionType: string; } export interface ComputeBudgetConfig { units?: number; microLamports?: number; } export interface LoadParams { forceUpdate?: boolean; } export interface TransferAmountFee { amount: TokenAmount; fee: TokenAmount | undefined; expirationTime: number | undefined; } export interface GetTransferAmountFee { amount: BN; fee: BN | undefined; expirationTime: number | undefined; } export type ReturnTypeFetchMultipleMintInfo = Mint & { feeConfig: TransferFeeConfig | undefined }; export interface ReturnTypeFetchMultipleMintInfos { [mint: string]: ReturnTypeFetchMultipleMintInfo; } type Primitive = boolean | number | string | null | undefined | PublicKey; /** * * @example * ```typescript * interface A { * keyA: string; * keyB: string; * map: { * hello: string; * i: number; * }; * list: (string | number)[]; * keyC: number; * } * * type WrappedA = ReplaceType // { * keyA: boolean; * keyB: boolean; * map: { * hello: boolean; * i: number; * }; * list: (number | boolean)[]; * keyC: number; * } * ``` */ export type ReplaceType = { [T in keyof Old]: Old[T] extends From // to avoid case: Old[T] is an Object, ? Exclude | To // when match, directly replace : Old[T] extends Primitive // judge whether need recursively replace ? From extends Old[T] // it's an Object ? Exclude | To // directly replace : Old[T] // stay same : ReplaceType; // recursively replace }; export type MayArray = T | Array; export type MayDeepArray = T | Array>; export type MayFunction = T | ((...Params: PS) => T); export type ArrayItem> = T extends Array ? P : never; export type ExactPartial = { [P in Extract]?: T[P]; } & { [P in Exclude]: T[P]; }; export type ExactRequired = { [P in Extract]-?: T[P]; } & { [P in Exclude]: T[P]; }; /** * extract only string and number */ export type SKeyof = Extract; export type GetValue = K extends keyof T ? T[K] : undefined; /** * @example * type A = { a: number; b: string; c?: string } * type B = { a: string; c: string; d?: boolean } * * type D = SOR // { a: number | string; b: string | undefined; c: string | undefined; d: boolean | undefined } // ! if use SOR, you lost union type guard feature, try NOT to use this trick */ export type SOR = { [K in keyof T | keyof U]: GetValue | GetValue }; export type Fallback = T extends undefined ? FallbackT : T; /** * @example * type A = { a: number; b: string; c?: string } * type B = { a: string; c: string; d?: boolean } * * type D = Cover // { a: string; b: string; c: string; d?: boolean} */ export type Cover = { [K in SKeyof | SKeyof]: Fallback, GetValue> }; export type UnionCover = T extends T ? Cover : never; type MergeArr = (Arr extends (infer T)[] ? T : never)[]; /** * typescript type helper function * @example * type A = { hello: string; version: 3 }[] * type B = { hello: string; version: 5 }[] * type OK = MergeArr // ({ hello: string; version: 3 } | { hello: string; version: 5 })[] * type Wrong = A | B // { hello: string; version: 3 }[] | { hello: string; version: 5 }[] // <= this type can't have auto type intelligense of array.map */ export const unionArr = (arr: T): MergeArr => arr as unknown as MergeArr;