fix IDL types parsing (#2176)

This commit is contained in:
Totoro 2022-09-12 15:04:11 +03:00 committed by GitHub
parent f155996c3c
commit 5ae52cae13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 11 deletions

View File

@ -38,7 +38,6 @@ describe("misc", () => {
const addr = await program.state.address();
const state = await program.state.fetch();
const accountInfo = await program.provider.connection.getAccountInfo(addr);
// @ts-expect-error
assert.isTrue(state.v.equals(Buffer.from([])));
assert.lengthOf(accountInfo.data, 99);
});

View File

@ -20,7 +20,7 @@ export { TransactionNamespace, TransactionFn } from "./transaction.js";
export { RpcNamespace, RpcFn } from "./rpc.js";
export { AccountNamespace, AccountClient, ProgramAccount } from "./account.js";
export { SimulateNamespace, SimulateFn } from "./simulate.js";
export { IdlAccounts, IdlTypes } from "./types.js";
export { IdlAccounts, IdlTypes, DecodeType } from "./types.js";
export { MethodsBuilderFactory, MethodsNamespace } from "./methods";
export { ViewNamespace, ViewFn } from "./views";

View File

@ -105,6 +105,7 @@ type TypeMap = {
publicKey: PublicKey;
bool: boolean;
string: string;
bytes: Buffer;
} & {
[K in "u8" | "i8" | "u16" | "i16" | "u32" | "i32" | "f32" | "f64"]: number;
} & {
@ -125,6 +126,8 @@ export type DecodeType<T extends IdlType, Defined> = T extends keyof TypeMap
? TypeMap[T["coption"]] | null
: T extends { vec: keyof TypeMap }
? TypeMap[T["vec"]][]
: T extends { vec: { defined: keyof Defined } }
? Defined[T["vec"]["defined"]][]
: T extends { array: [defined: keyof TypeMap, size: number] }
? TypeMap[T["array"][0]][]
: unknown;
@ -147,24 +150,31 @@ type FieldsOfType<I extends IdlTypeDef> = NonNullable<
>[number];
export type TypeDef<I extends IdlTypeDef, Defined> = {
[F in FieldsOfType<I>["name"]]: DecodeType<
(FieldsOfType<I> & { name: F })["type"],
Defined
>;
[F in FieldsOfType<I> as F["name"]]: DecodeType<F["type"], Defined>;
};
type TypeDefDictionary<T extends IdlTypeDef[], Defined> = {
[K in T[number]["name"]]: TypeDef<T[number] & { name: K }, Defined>;
[K in T[number] as K["name"]]: TypeDef<K, Defined>;
};
export type IdlTypes<T extends Idl> = TypeDefDictionary<
NonNullable<T["types"]>,
Record<string, never>
type NestedTypeDefDictionary<T extends IdlTypeDef[]> = {
[Outer in T[number] as Outer["name"]]: TypeDef<
Outer,
{
[Inner in T[number] as Inner["name"]]: Inner extends Outer
? never
: TypeDef<Inner, Record<string, never>>;
}
>;
};
export type IdlTypes<T extends Idl> = NestedTypeDefDictionary<
NonNullable<T["types"]>
>;
export type IdlAccounts<T extends Idl> = TypeDefDictionary<
NonNullable<T["accounts"]>,
Record<string, never>
IdlTypes<T>
>;
export type IdlErrorInfo<IDL extends Idl> = NonNullable<IDL["errors"]>[number];