micro-sol-signer
Version:
Create, sign & decode Solana transactions with minimum deps
465 lines • 18.4 kB
TypeScript
import * as P from 'micro-packed';
import type { Instruction } from '../index.ts';
export declare const PRECISION = 9;
export declare const Decimal: P.Coder<bigint, string>;
export type Bytes = Uint8Array;
export declare const shortU16: P.CoderType<number>;
export declare const pubKey: P.CoderType<string>;
export declare function isOnCurve(bytes: Bytes | string): boolean;
export declare function programAddress(program: string, ...seeds: Bytes[]): string;
type ArrLike<T> = Array<T> | ReadonlyArray<T>;
type Node<K extends string, F = {}> = {
readonly kind: K;
} & F;
type NumberValue = Node<'numberValueNode', {
readonly number: number;
}>;
type NoneValue = Node<'noneValueNode'>;
type BytesValue = Node<'bytesValueNode', {
readonly data: string;
readonly encoding: 'base16' | 'base58' | 'base64' | 'utf8';
}>;
type BooleanValue = Node<'booleanValueNode', {
readonly boolean: boolean;
}>;
type AccountBumpValue = Node<'accountBumpValueNode', {
readonly name: string;
}>;
type PublicKeyValue = Node<'publicKeyValueNode', {
readonly publicKey: string;
}>;
type PayerValue = Node<'payerValueNode'>;
type PdaLink = Node<'pdaLinkNode', {
readonly name: string;
}>;
type PdaSeedValue = Node<'pdaSeedValueNode', {
readonly name: string;
readonly value: Node<'accountValueNode' | 'argumentValueNode', {
readonly name: string;
}>;
}>;
type PdaValue = Node<'pdaValueNode', {
readonly pda: PdaLink;
readonly seeds: ArrLike<PdaSeedValue>;
}>;
type IdentityValue = Node<'identityValueNode'>;
type AccountValue = Node<'accountValueNode', {
readonly name: 'authority';
}>;
type DefaultValue = NumberValue | NoneValue | AccountBumpValue | BytesValue | BooleanValue | PublicKeyValue | PayerValue | PdaValue | IdentityValue | AccountValue;
type DefaultValueMap = {
boolean: BooleanValue;
number: NumberValue;
bytes: BytesValue;
none: NoneValue;
publicKey: PublicKeyValue;
payer: PayerValue;
pda: PdaValue;
identity: IdentityValue;
account: AccountValue;
};
type DefaultValueDef<T extends keyof DefaultValueMap> = {
defaultValue?: DefaultValueMap[T];
defaultValueStrategy?: 'omitted' | 'optional';
};
declare const IGNORE_DEFAULT: readonly ["payerValueNode", "accountBumpValueNode", "identityValueNode", "pdaValueNode"];
type FieldDiscriminator = Node<'fieldDiscriminatorNode', {
readonly name: string;
readonly offset: number;
}>;
type SizeDiscriminator = Node<'sizeDiscriminatorNode', {
readonly size: number;
}>;
type ConstantDiscriminator = Node<'constantDiscriminatorNode', {
readonly offset: number;
readonly constant: ConstantType;
}>;
type Discriminator = SizeDiscriminator | FieldDiscriminator | ConstantDiscriminator;
declare const NumCoders: {
readonly shortU16: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly u8: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly u16: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly u32: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly u64: {
readonly le: P.CoderType<bigint>;
readonly be: P.CoderType<bigint>;
readonly bigint: true;
};
readonly u128: {
readonly le: P.CoderType<bigint>;
readonly be: P.CoderType<bigint>;
readonly bigint: true;
};
readonly i8: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly i16: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly i32: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly i64: {
readonly le: P.CoderType<bigint>;
readonly be: P.CoderType<bigint>;
readonly bigint: true;
};
readonly i128: {
readonly le: P.CoderType<bigint>;
readonly be: P.CoderType<bigint>;
readonly bigint: true;
};
readonly f32: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
readonly f64: {
readonly le: P.CoderType<number>;
readonly be: P.CoderType<number>;
readonly bigint: false;
};
};
type BigIntCoders = {
[K in keyof typeof NumCoders]: (typeof NumCoders)[K]['bigint'] extends true ? K : never;
}[keyof typeof NumCoders];
type NumericType = Node<'numberTypeNode', {
readonly format: 'shortU16' | keyof typeof NumCoders;
readonly endian?: 'le' | 'be';
}> & DefaultValueDef<'number'>;
type GetTypeNumeric<T extends NumericType> = T['format'] extends BigIntCoders ? bigint : number;
type CountType = Node<'prefixedCountNode', {
prefix: NumericType;
}> | Node<'remainderCountNode'> | Node<'fixedCountNode', {
value: number;
}>;
type EnumVariants = (Node<'enumEmptyVariantTypeNode'> | Node<'enumStructVariantTypeNode', {
readonly struct: any;
}> | Node<'enumTupleVariantTypeNode', {
readonly tuple: TupleType;
}>) & {
readonly name: string;
readonly discriminator?: number;
};
type EnumType = Node<'enumTypeNode', {
readonly variants: ArrLike<EnumVariants>;
readonly size: NumericType;
}>;
type ArrayType = Node<'arrayTypeNode', {
readonly item: BasicType;
readonly count: CountType;
}>;
type PublicKeyType = Node<'publicKeyTypeNode'>;
type TypeLinkType = Node<'definedTypeLinkNode', {
readonly name: string;
}>;
type BooleanType = Node<'booleanTypeNode', {
readonly size: NumericType;
}> & DefaultValueDef<'boolean'>;
type StringType = Node<'stringTypeNode'>;
type StructField = Node<'structFieldTypeNode', {
readonly name: string;
readonly type: BasicType;
}> & DefaultValueDef<any>;
type StructType = Node<'structTypeNode', {
readonly fields: ArrLike<StructField>;
}>;
type OptionalType = Node<'optionTypeNode', {
readonly item: BasicType;
readonly prefix?: NumericType;
readonly fixed?: boolean;
}>;
type AmountType = Node<'amountTypeNode', {
readonly decimals: number;
readonly unit: string;
readonly number: NumericType;
}>;
type FixedSizeType = Node<'fixedSizeTypeNode', {
readonly size: number;
readonly type: BasicType;
}>;
type BytesType = Node<'bytesTypeNode'>;
type PrefixType = Node<'sizePrefixTypeNode', {
readonly type: BasicType;
readonly prefix: NumericType;
}>;
type ZeroableType = Node<'zeroableOptionTypeNode', {
readonly item: BasicType;
}>;
type RemainderOptionType = Node<'remainderOptionTypeNode', {
readonly item: BasicType;
}>;
type HiddenPrefixType = Node<'hiddenPrefixTypeNode', {
readonly type: BasicType;
readonly prefix: ArrLike<BasicType>;
}>;
type HiddenSuffixType = Node<'hiddenSuffixTypeNode', {
readonly type: BasicType;
readonly suffix: ArrLike<BasicType>;
}>;
type ConstantType = Node<'constantValueNode', {
readonly type: BasicType;
readonly value: any;
}>;
type PreOffsetType = Node<'preOffsetTypeNode', {
readonly offset: number;
readonly strategy: 'padded' | 'absolute' | 'relative';
readonly type: BasicType;
}>;
type PostOffsetType = Node<'PostOffsetTypeNode', {
readonly offset: number;
readonly strategy: 'padded' | 'absolute' | 'relative';
readonly type: BasicType;
}>;
type TupleType = Node<'tupleTypeNode', {
readonly items: ArrLike<BasicType>;
}>;
type MapType = Node<'mapTypeNode', {
readonly key: BasicType;
readonly value: BasicType;
readonly count: CountType;
}>;
type BasicType = (EnumType | NumericType | OptionalType | StructType | ArrayType | PublicKeyType | TypeLinkType | StringType | BooleanType | AmountType | FixedSizeType | BytesType | ZeroableType | PrefixType | RemainderOptionType | ConstantType | PreOffsetType | StructField | HiddenPrefixType | HiddenSuffixType | PostOffsetType | TupleType | MapType) & {
defaultValue?: DefaultValue;
defaultValueStrategy?: 'omitted' | 'optional';
};
type DefinedTypes = Record<string, P.CoderType<any>>;
type GetTypeStruct<T extends StructType, DT extends DefinedTypes = {}> = {
[K in T['fields'][number]['name']]: GetType<Extract<T['fields'][number], {
name: K;
}>['type'], DT>;
};
type GetTypeTuple<T extends TupleType, DT extends DefinedTypes = {}> = T['items'] extends readonly [
infer A
] ? [A extends BasicType ? GetType<A, DT> : never] : T['items'] extends readonly [infer A, infer B] ? [A extends BasicType ? GetType<A, DT> : never, B extends BasicType ? GetType<B, DT> : never] : T['items'] extends readonly [infer A, infer B, infer C] ? [
A extends BasicType ? GetType<A, DT> : never,
B extends BasicType ? GetType<B, DT> : never,
C extends BasicType ? GetType<C, DT> : never
] : T['items'] extends ReadonlyArray<infer Item> ? (Item extends BasicType ? GetType<Item, DT> : never)[] : never[];
type GetTypeEnum<T extends EnumType, DT extends DefinedTypes = {}> = T['variants'] extends readonly [] ? never : T['variants'][number] extends infer Variant ? Variant extends Node<'enumEmptyVariantTypeNode'> & {
readonly name: infer Name;
} ? {
TAG: Name extends string ? Name : never;
} : Variant extends Node<'enumStructVariantTypeNode'> & {
readonly name: infer Name;
readonly struct: infer Struct;
} ? {
TAG: Name extends string ? Name : never;
data: Struct extends StructType ? GetTypeStruct<Struct, DT> : never;
} : Variant extends Node<'enumTupleVariantTypeNode'> & {
readonly name: infer Name;
readonly tuple: infer Tuple;
} ? {
TAG: Name extends string ? Name : never;
data: Tuple extends TupleType ? GetTypeTuple<Tuple, DT> : never;
} : never : never;
type GetTypeLink<T extends TypeLinkType, DT extends DefinedTypes = {}> = T['name'] extends keyof DT ? P.UnwrapCoder<DT[T['name']]> : never;
type GetTypeBase<T extends BasicType, DT extends DefinedTypes = {}> = T extends NumericType ? GetTypeNumeric<T> : T extends BooleanType ? boolean : T extends StringType ? string : T extends AmountType ? string : T extends BytesType ? Uint8Array : T extends PublicKeyType ? string : T extends ArrayType ? (GetType<T['item'], DT>)[] : T extends MapType ? Map<GetType<T['key'], DT>, GetType<T['value'], DT>> : T extends StructType ? GetTypeStruct<T, DT> : T extends TupleType ? GetTypeTuple<T, DT> : T extends EnumType ? GetTypeEnum<T, DT> : T extends TypeLinkType ? GetTypeLink<T, DT> : T extends FixedSizeType ? GetType<T['type'], DT> : T extends HiddenPrefixType ? GetType<T['type'], DT> : T extends HiddenSuffixType ? GetType<T['type'], DT> : T extends PreOffsetType ? GetType<T['type'], DT> : T extends PostOffsetType ? GetType<T['type'], DT> : T extends ZeroableType ? GetType<T['item'], DT> : T extends PrefixType ? GetType<T['type'], DT> : T extends ConstantType ? GetType<T['type'], DT> : T extends RemainderOptionType ? GetType<T['item'], DT> | undefined : T extends OptionalType ? GetType<T['item'], DT> | undefined : unknown;
export type GetType<T extends BasicType, DT extends DefinedTypes = {}> = T extends {
defaultValue: Exclude<DefaultValue, {
kind: (typeof IGNORE_DEFAULT)[number];
}>;
defaultValueStrategy?: infer Strategy;
} ? Strategy extends 'omitted' ? undefined : Strategy extends 'optional' | undefined ? GetTypeBase<T, DT> | undefined : GetTypeBase<T, DT> : GetTypeBase<T, DT>;
export declare function mapType<T extends BasicType, DT extends DefinedTypes>(type: T, dt: DT): GetType<T, DT>;
type DefinedType = {
readonly kind: 'definedTypeNode';
readonly name: string;
readonly type: BasicType;
};
export type GetDefinedTypes<T extends ArrLike<DefinedType>> = {
[K in T[number]['name']]: P.CoderType<GetType<Extract<T[number], {
name: K;
}>['type']>>;
};
type PDASeeds = Node<'variablePdaSeedNode', {
readonly name: string;
readonly type: BasicType;
}> | Node<'constantPdaSeedNode', {
readonly name: string;
readonly type: BasicType;
readonly value: DefaultValue;
}>;
type PDAType = Node<'pdaNode', {
readonly name: string;
readonly seeds: ArrLike<PDASeeds>;
}>;
type GetPDASeeds<T extends PDAType, DT extends DefinedTypes = {}> = {
[K in Extract<T['seeds'][number], {
name: string;
}>['name']]: Extract<T['seeds'][number], {
name: K;
}> extends Node<'variablePdaSeedNode', {
readonly type: infer Type;
}> ? GetType<Type & BasicType, DT> : Extract<T['seeds'][number], {
name: K;
}> extends Node<'constantPdaSeedNode', {
readonly type: infer Type;
}> ? GetType<Type & BasicType, DT> : never;
};
type PDAs<T extends ArrLike<PDAType>, DT extends DefinedTypes = {}> = {
[K in T[number]['name']]: (value: GetPDASeeds<Extract<T[number], {
name: K;
}>, DT>) => string;
};
export declare function parsePDAs<T extends ArrLike<PDAType>, DT extends DefinedTypes = {}>(program: string, pda: T, dt?: DT): PDAs<T, DT>;
type Account = Node<'instructionAccountNode', {
readonly name: string;
readonly isWritable: boolean;
readonly isSigner: boolean | 'either';
readonly isOptional: boolean;
}> & DefaultValueDef<'publicKey' | 'pda' | 'identity' | 'payer' | 'account'>;
type Argument = Node<'instructionArgumentNode', {
readonly name: string;
readonly type: BasicType;
}> & DefaultValueDef<any>;
type GetArgumentType<A extends Argument, DT extends DefinedTypes = {}> = A extends {
type: infer T extends BasicType;
defaultValue: infer DV;
defaultValueStrategy: infer DVS;
} ? GetType<{
defaultValue: DV;
defaultValueStrategy: DVS;
} & T, DT> : A extends {
type: infer T extends BasicType;
defaultValue: infer DV;
} ? GetType<{
defaultValue: DV;
defaultValueStrategy: undefined;
} & T, DT> : A extends {
type: infer T extends BasicType;
} ? GetType<T, DT> : unknown;
export type GetTypeArguments<T extends ArrLike<Argument>, DT extends DefinedTypes = {}> = {
[K in Extract<T[number], {
name: string;
}>['name']]: GetArgumentType<Extract<T[number], {
name: K;
}>, DT>;
};
type RemainingAccounts = Node<'instructionRemainingAccountsNode', {
readonly value: Node<'argumentValueNode', {
readonly name: string;
}>;
}>;
type ProgramInstruction = Node<'instructionNode', {
readonly accounts: ArrLike<Account>;
readonly arguments: ArrLike<Argument>;
readonly discriminators?: ArrLike<Discriminator>;
readonly remainingAccounts?: ArrLike<RemainingAccounts>;
readonly name: string;
readonly optionalAccountStrategy?: 'programId' | 'omitted';
}>;
export type GetTypeAccounts<T extends ArrLike<Account>> = {
[K in Extract<T[number], {
name: string;
}>['name']]: Extract<T[number], {
name: K;
}> extends {
defaultValue?: {
kind: 'publicKeyValueNode';
};
} ? undefined : string;
};
export type Nullable<T> = {
[K in keyof T as undefined extends T[K] ? never : K]: T[K];
} & {
[K in keyof T as undefined extends T[K] ? K : never]?: Exclude<T[K], undefined>;
};
export type GetInstructionArgs<T extends ProgramInstruction, DT extends DefinedTypes = {}> = Nullable<GetTypeArguments<T['arguments'], DT> & GetTypeAccounts<T['accounts']>>;
type DecodedInstruction<T extends ProgramInstruction, DT extends DefinedTypes = {}> = {
TAG: string;
data: GetInstructionArgs<T, DT> & {
[K in Extract<T['accounts'][number], {
name: string;
}>['name']]?: string;
};
};
export type ParsedInstructions<T extends ArrLike<ProgramInstruction>, DT extends DefinedTypes = {}> = {
encoders: {
[K in T[number]['name']]: (inst: GetInstructionArgs<Extract<T[number], {
name: K;
}>, DT>) => Instruction;
};
decoder: (inst: Instruction, opts?: P.ReaderOpts) => DecodedInstruction<T[number], DT>;
};
type ContractAccount = {
readonly kind: 'accountNode';
readonly name: string;
readonly data: BasicType;
readonly discriminators?: ArrLike<Discriminator>;
};
type DecodedAccount<T extends ArrLike<ContractAccount>, DT extends DefinedTypes = {}> = {
[K in T[number]['name']]: {
TAG: K;
data: GetType<Extract<T[number], {
name: K;
}>['data'], DT>;
};
}[T[number]['name']];
export type AccountDefinitions<T extends ArrLike<ContractAccount>, DT extends DefinedTypes = {}> = {
coders: {
[K in T[number]['name']]: P.CoderType<GetType<Extract<T[number], {
name: K;
}>['data'], DT>>;
};
decoder: (data: Uint8Array, opts?: P.ReaderOpts) => DecodedAccount<T, DT>;
};
export declare function defineAccounts<T extends ArrLike<ContractAccount>, DT extends DefinedTypes>(accounts: T, types: DT): AccountDefinitions<T, DT>;
type Program = {
readonly kind: 'programNode';
readonly name: string;
readonly publicKey: string;
readonly definedTypes: ArrLike<DefinedType>;
readonly pdas: ArrLike<PDAType>;
readonly instructions: ArrLike<ProgramInstruction>;
readonly accounts: ArrLike<ContractAccount>;
};
type GetTypeProgram<P extends Program> = {
name: P['name'];
contract: P['publicKey'];
types: GetDefinedTypes<P['definedTypes']>;
pdas: PDAs<P['pdas'], GetDefinedTypes<P['definedTypes']>>;
instructions: ParsedInstructions<P['instructions'], GetDefinedTypes<P['definedTypes']>>;
accounts: AccountDefinitions<P['accounts'], GetDefinedTypes<P['definedTypes']>>;
};
export declare function defineProgram<P extends Program>(p: P): GetTypeProgram<P>;
type IDL = {
readonly kind: 'rootNode';
readonly program: Program;
readonly additionalPrograms: ArrLike<Program>;
};
type GetTypeIDL<T extends IDL> = {
[P in T['program']['name']]: {
program: GetTypeProgram<T['program']>;
additionalPrograms: {
[K in T['additionalPrograms'][number]['name']]: GetTypeProgram<Extract<T['additionalPrograms'][number], {
name: K;
}>>;
};
};
};
export declare function defineIDL<T extends IDL>(idl: T): GetTypeIDL<T>;
export {};
//# sourceMappingURL=index.d.ts.map