/* eslint-disable @typescript-eslint/no-redeclare */ // copy from https://github.com/solana-labs/solana/blob/master/explorer/src/components/instruction/token/types.ts // https://github.com/solana-labs/explorer/blob/411b42439553262ef9036985d287a7249acaad77/src/components/instruction/token/types.ts import { enums, type, Infer, number, string, optional, array, nullable, union, coerce, instance, } from "superstruct"; // Replace with string export const PublicKeyFromString = coerce( instance(String), string(), (value) => (value) ); export type TokenAmountUi = Infer; export type MintTo = Infer; export type Burn = Infer; export type InitializeMint = Infer; export type InitializeAccount = Infer; export type InitializeAccount2 = Infer; export type InitializeAccount3 = Infer; export type InitializeMultisig = Infer; export const TokenAmountUi = type({ amount: string(), decimals: number(), uiAmountString: string(), }); const InitializeMint = type({ mint: PublicKeyFromString, decimals: number(), mintAuthority: PublicKeyFromString, rentSysvar: PublicKeyFromString, freezeAuthority: optional(PublicKeyFromString), }); const InitializeAccount = type({ account: PublicKeyFromString, mint: PublicKeyFromString, owner: PublicKeyFromString, rentSysvar: PublicKeyFromString, }); const InitializeAccount2 = type({ account: PublicKeyFromString, mint: PublicKeyFromString, rentSysvar: PublicKeyFromString, owner: PublicKeyFromString, }); const InitializeAccount3 = type({ account: PublicKeyFromString, mint: PublicKeyFromString, owner: PublicKeyFromString, }); const InitializeMultisig = type({ multisig: PublicKeyFromString, rentSysvar: PublicKeyFromString, signers: array(PublicKeyFromString), m: number(), }); export type Transfer = Infer; export const Transfer = type({ source: PublicKeyFromString, destination: PublicKeyFromString, amount: union([string(), number()]), authority: optional(PublicKeyFromString), multisigAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type Approve = Infer; const Approve = type({ source: PublicKeyFromString, delegate: PublicKeyFromString, amount: union([string(), number()]), owner: optional(PublicKeyFromString), multisigOwner: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type Revoke = Infer; const Revoke = type({ source: PublicKeyFromString, owner: optional(PublicKeyFromString), multisigOwner: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); const AuthorityType = enums([ "mintTokens", "freezeAccount", "accountOwner", "closeAccount", ]); export type SetAuthority = Infer; const SetAuthority = type({ mint: optional(PublicKeyFromString), account: optional(PublicKeyFromString), authorityType: AuthorityType, newAuthority: nullable(PublicKeyFromString), authority: optional(PublicKeyFromString), multisigAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); const MintTo = type({ mint: PublicKeyFromString, account: PublicKeyFromString, amount: union([string(), number()]), mintAuthority: optional(PublicKeyFromString), multisigMintAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); const Burn = type({ account: PublicKeyFromString, mint: PublicKeyFromString, amount: union([string(), number()]), authority: optional(PublicKeyFromString), multisigAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); const CloseAccount = type({ account: PublicKeyFromString, destination: PublicKeyFromString, owner: optional(PublicKeyFromString), multisigOwner: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type CloseAccount = Infer; export type FreezeAccount = Infer; const FreezeAccount = type({ account: PublicKeyFromString, mint: PublicKeyFromString, freezeAuthority: optional(PublicKeyFromString), multisigFreezeAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type ThawAccount = Infer; const ThawAccount = type({ account: PublicKeyFromString, mint: PublicKeyFromString, freezeAuthority: optional(PublicKeyFromString), multisigFreezeAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type TransferChecked = Infer; export const TransferChecked = type({ source: PublicKeyFromString, mint: PublicKeyFromString, destination: PublicKeyFromString, authority: optional(PublicKeyFromString), multisigAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), tokenAmount: TokenAmountUi, }); export type ApproveChecked = Infer; const ApproveChecked = type({ source: PublicKeyFromString, mint: PublicKeyFromString, delegate: PublicKeyFromString, owner: optional(PublicKeyFromString), multisigOwner: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), tokenAmount: TokenAmountUi, }); export type MintToChecked = Infer; const MintToChecked = type({ account: PublicKeyFromString, mint: PublicKeyFromString, mintAuthority: optional(PublicKeyFromString), multisigMintAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), tokenAmount: TokenAmountUi, }); export type BurnChecked = Infer; const BurnChecked = type({ account: PublicKeyFromString, mint: PublicKeyFromString, authority: optional(PublicKeyFromString), multisigAuthority: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), tokenAmount: TokenAmountUi, }); export type SyncNative = Infer; const SyncNative = type({ account: PublicKeyFromString, }); export type GetAccountDataSize = Infer; const GetAccountDataSize = type({ mint: PublicKeyFromString, extensionTypes: optional(array(string())), }); export type InitializeImmutableOwner = Infer; const InitializeImmutableOwner = type({ account: PublicKeyFromString, }); export type AmountToUiAmount = Infer; const AmountToUiAmount = type({ mint: PublicKeyFromString, amount: union([string(), number()]), }); export type UiAmountToAmount = Infer; const UiAmountToAmount = type({ mint: PublicKeyFromString, uiAmount: string(), }); export type InitializeMintCloseAuthority = Infer; const InitializeMintCloseAuthority = type({ mint: PublicKeyFromString, newAuthority: PublicKeyFromString, }); export type TransferFeeExtension = Infer; const TransferFeeExtension = type({ mint: PublicKeyFromString, transferFeeConfigAuthority: PublicKeyFromString, withdrawWitheldAuthority: PublicKeyFromString, transferFeeBasisPoints: number(), maximumFee: number(), }); export type DefaultAccountStateExtension = Infer; const DefaultAccountStateExtension = type({ mint: PublicKeyFromString, accountState: string(), freezeAuthority: optional(PublicKeyFromString), }); export type Reallocate = Infer; const Reallocate = type({ account: PublicKeyFromString, payer: PublicKeyFromString, systemProgram: PublicKeyFromString, extensionTypes: array(string()), }); export type MemoTransferExtension = Infer; const MemoTransferExtension = type({ account: PublicKeyFromString, owner: optional(PublicKeyFromString), multisigOwner: optional(PublicKeyFromString), signers: optional(array(PublicKeyFromString)), }); export type CreateNativeMint = Infer; const CreateNativeMint = type({ payer: PublicKeyFromString, nativeMint: PublicKeyFromString, systemProgram: PublicKeyFromString, });