tronweb
Version:
JavaScript SDK that encapsulates the TRON HTTP API
283 lines (229 loc) • 11.3 kB
text/typescript
import type { Address } from "./Trx";
import type { Method } from "../lib/contract/method";
import type { Contract } from "../lib/contract/index";
export type AbiParamsCommon = {
readonly name: string;
readonly type: string;
readonly baseType?: string;
readonly indexed?: boolean;
readonly components?: ReadonlyArray<AbiParamsCommon>;
readonly arrayLength?: number;
readonly arrayChildren?: ReadonlyArray<AbiParamsCommon>;
readonly internalType?: string;
};
export type StateMutabilityTypes = string | 'nonpayable' | 'payable' | 'pure' | 'view';
export type FragmentTypes = string | 'constructor' | 'event' | 'function' | 'fallback' | 'receive';
export type AbiInputsType = ReadonlyArray<AbiParamsCommon> | Record<any, any> | [];
export type AbiOutputsType = AbiInputsType;
export type ConstructorFragment = {
readonly type: string | 'constructor';
readonly stateMutability: StateMutabilityTypes & (string | 'nonpayable' | 'payable');
readonly inputs?: ReadonlyArray<AbiParamsCommon>;
};
export type FunctionFragment = {
readonly name: string;
readonly type: string | 'function';
readonly stateMutability?: StateMutabilityTypes;
readonly inputs?: ReadonlyArray<AbiParamsCommon>;
readonly outputs?: ReadonlyArray<AbiParamsCommon>;
readonly constant?: boolean;
readonly payable?: boolean;
};
export type FallbackFragment = {
readonly name: never;
readonly type: string | 'fallback';
readonly stateMutability: StateMutabilityTypes;
readonly inputs: never;
readonly outputs: never;
// legacy properties
readonly constant?: boolean;
readonly payable?: boolean;
};
export type ReceiveFragment = {
readonly name: never;
readonly type: string | 'receive';
readonly stateMutability: StateMutabilityTypes;
readonly inputs: never;
readonly outputs: never;
// legacy properties
readonly constant?: boolean;
readonly payable?: boolean;
};
export type EventFragment = {
readonly name: string;
readonly type: string | 'event';
readonly inputs?: ReadonlyArray<AbiParamsCommon>;
readonly anonymous?: boolean;
};
export type ErrorFragment = {
readonly name: string;
readonly type: string | 'error';
readonly inputs?: ReadonlyArray<AbiParamsCommon>;
};
export type AbiFragment =
| ConstructorFragment
| FunctionFragment
| EventFragment
| ErrorFragment
| FallbackFragment
| ReceiveFragment;
export type ContractAbiInterface = ReadonlyArray<AbiFragment>;
type _GrowArr<Length extends number, T = any, Arr extends T[] = []> = Arr['length'] extends Length
? Readonly<Arr>
: _GrowArr<Length, T, [...Arr, T]>;
type _RangeFrom0ToN<N extends number, Step extends number, Arr extends any[] = []> = Arr['length'] extends N
? Arr['length']
: Arr['length'] | _RangeFrom0ToN<N, Step, [...Arr, ..._GrowArr<Step>]>;
type Range<Min extends number, Max extends number, Step extends number = 1> = Exclude<_RangeFrom0ToN<Max, Step>, _RangeFrom0ToN<Min, Step>> | Min;
export type BytesRange = Range<1, 32>;
export type BitsRange = Range<8, 256, 8>;
export type Numbers = bigint | number;
type ConvertToNumber<T extends string> = T extends `${infer Num extends number}` ? Num : never;
type FixedSizeArray<T, Length extends number> = _GrowArr<Length, T>;
type SolidityTypedArray<T, Length extends string> = Length extends ''
? ReadonlyArray<T>
: FixedSizeArray<T, ConvertToNumber<Length>>;
type ReverseArray<T extends string> = T extends `[${infer P}]${infer L}` ? `${ReverseArray<L>}[${P}]` : '';
type _SolidityAddressType<Type extends string> = Type extends `address[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityAddressType<`address${Loop}`>, Length>
: Type extends 'address'
? Address
: never;
export type SolidityAddressType<Type extends string> = Type extends `address${infer Loop}`
? _SolidityAddressType<`address${ReverseArray<Loop>}`>
: never;
type _SolidityStringType<Type extends string> = Type extends `string${infer Size extends number | ''}[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityStringType<`string${Size}${Loop}`>, Length>
: Type extends `string${number | ''}`
? string
: never;
export type SolidityStringType<Type> = Type extends `string${infer Loop}`
? _SolidityStringType<`string${ReverseArray<Loop>}`>
: never;
type _SolidityBooleanType<Type extends string> = Type extends `bool[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityBooleanType<`bool${Loop}`>, Length>
: Type extends 'bool'
? boolean
: never;
export type SolidityBooleanType<Type extends string> = Type extends `bool${infer Loop}`
? _SolidityBooleanType<`bool${ReverseArray<Loop>}`>
: never;
type _SolidityUIntegerType<Type extends string> = Type extends `uint${infer Bits extends BitsRange | ''}[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityUIntegerType<`uint${Bits}${Loop}`>, Length>
: Type extends `uint${BitsRange | ''}`
? Numbers
: never;
export type SolidityUIntegerType<Type extends string> = Type extends `uint${infer Bits extends BitsRange | ''}[${infer Length}]${infer Loop}`
? _SolidityUIntegerType<`uint${Bits}${ReverseArray<`[${Length}]${Loop}`>}`>
: Type extends `uint${BitsRange | ''}`
? Numbers
: never;
type _SolidityIntegerType<Type extends string> = Type extends `int${infer Bits extends BitsRange | ''}[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityIntegerType<`int${Bits}${Loop}`>, Length>
: Type extends `int${BitsRange | ''}`
? Numbers
: never;
export type SolidityIntegerType<Type extends string> = Type extends `int${infer Bits extends BitsRange | ''}[${infer Length}]${infer Loop}`
? _SolidityIntegerType<`int${Bits}${ReverseArray<`[${Length}]${Loop}`>}`>
: Type extends `int${BitsRange | ''}`
? Numbers
: never;
type _SolidityTrcTokenType<Type extends string> = Type extends `trcToken[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityTrcTokenType<`trcToken${Loop}`>, Length>
: Type extends 'trcToken'
? Numbers
: never;
export type SolidityTrcTokenType<Type extends string> = Type extends `trcToken${infer Loop}`
? _SolidityTrcTokenType<`trcToken${ReverseArray<Loop>}`>
: never;
type _SolidityBytesType<Type extends string> = Type extends `bytes${infer Size extends BytesRange | ''}[${infer Length}]${infer Loop}`
? SolidityTypedArray<_SolidityBytesType<`bytes${Size}${Loop}`>, Length>
: Type extends `bytes${BytesRange | ''}`
? string | Uint8Array<ArrayBuffer>
: never;
export type SolidityBytesType<Type extends string> = Type extends `bytes${infer Size extends BytesRange | ''}[${infer Length}]${infer Loop}`
? _SolidityBytesType<`bytes${Size}${ReverseArray<`[${Length}]${Loop}`>}`>
: Type extends `bytes${BytesRange | ''}`
? string | Uint8Array<ArrayBuffer>
: never;
type _SolidityTupleType<
Type extends string,
TypeComponents extends ReadonlyArray<AbiParamsCommon> | undefined,
> = TypeComponents extends ReadonlyArray<AbiParamsCommon>
? Type extends 'tuple'
? GetParamsType<TypeComponents>
: Type extends `tuple[${infer Length}]${infer Loop}`
? Loop extends ''
? SolidityTypedArray<GetParamsType<TypeComponents>, Length>
: SolidityTypedArray<_SolidityTupleType<`tuple${Loop}`, TypeComponents>, Length>
: never
: never;
export type SolidityTupleType<
Type extends string,
TypeComponents extends ReadonlyArray<AbiParamsCommon> | undefined,
> = Type extends `tuple${infer Loop}`
? _SolidityTupleType<`tuple${ReverseArray<Loop>}`, TypeComponents>
: never;
export type SolidityValueType<T extends string, C extends ReadonlyArray<AbiParamsCommon> | undefined> =
| SolidityAddressType<T>
| SolidityStringType<T>
| SolidityBooleanType<T>
| SolidityUIntegerType<T>
| SolidityIntegerType<T>
| SolidityTrcTokenType<T>
| SolidityBytesType<T>
| SolidityTupleType<T, C>;
type SimplifySolidityType<T> = T extends infer U ? U : never;
type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
export type GetParamsType<ParamsType extends ReadonlyArray<AbiParamsCommon> | undefined> = ParamsType extends readonly [infer T, ...infer P]
? T extends AbiParamsCommon
? P extends readonly []
? [SimplifySolidityType<SolidityValueType<T['type'], T['components']>>]
: P extends ReadonlyArray<AbiParamsCommon>
? [SimplifySolidityType<SolidityValueType<T['type'], T['components']>>, ...GetParamsType<P>]
: [SimplifySolidityType<SolidityValueType<T['type'], T['components']>>]
: []
: any[];
type GetTupleOutputType<T extends `tuple${string}`, Shape extends ReadonlyArray<AbiParamsCommon> | undefined> = T extends 'tuple'
? Shape extends ReadonlyArray<AbiParamsCommon>
? _GetOutputsType<Shape> & Prettify<Omit<{
[Item in Shape[number] as Item['name']]: Item['type'] extends `tuple${string}`
? GetTupleOutputType<Item['type'], Item['components']>
: SimplifySolidityType<SolidityValueType<Item['type'], undefined>>
}, 'length'>>
: never
: T extends `tuple[${infer Length}]${infer Loop}`
? Loop extends ''
? SolidityTypedArray<GetTupleOutputType<`tuple`, Shape>, Length>
: SolidityTypedArray<GetTupleOutputType<`tuple${Loop}`, Shape>, Length>
: never;
type _GetOutputsType<Outputs extends ReadonlyArray<AbiParamsCommon> | undefined> = Outputs extends readonly [infer T,...infer P]
? T extends AbiParamsCommon
? P extends readonly []
? T['type'] extends `tuple${string}`
? [GetTupleOutputType<T['type'], T['components']>]
: [SimplifySolidityType<SolidityValueType<T['type'], undefined>>]
: P extends ReadonlyArray<AbiParamsCommon>
? T['type'] extends `tuple${string}`
? [GetTupleOutputType<T['type'], T['components']>, ..._GetOutputsType<P>]
: [SimplifySolidityType<SolidityValueType<T['type'], undefined>>, ..._GetOutputsType<P>]
: []
: []
: [];
export type GetOutputsType<Outputs extends ReadonlyArray<AbiParamsCommon> | undefined> = GetTupleOutputType<'tuple', Outputs>;
export type GetMethodsTypeFromAbi<Abi extends ContractAbiInterface> = Abi extends readonly [infer T, ...infer P]
? T extends { type: 'function', name: string }
? {
[key in T['name']]: Method<T>;
} & (P extends ContractAbiInterface ? GetMethodsTypeFromAbi<P> : never )
: (P extends ContractAbiInterface ? GetMethodsTypeFromAbi<P> : never )
: { [key: string]: Method<any>; };
export type GetOnMethodTypeFromAbi<Abi extends ContractAbiInterface> = {
[key in keyof GetMethodsTypeFromAbi<Abi>]: GetMethodsTypeFromAbi<Abi>[key]['onMethod'];
};
export type AnyOnMethodType = {
[key: string]: Method<any>['onMethod'];
};
export type ContractInstance<Abi extends ContractAbiInterface> = Contract<Abi> & GetOnMethodTypeFromAbi<Abi>;