Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,036 changes: 1,036 additions & 0 deletions src/abi/fungible_asset.ts

Large diffs are not rendered by default.

77 changes: 68 additions & 9 deletions src/core/__tests__/createViewPayload.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import { parseTypeTag } from '@aptos-labs/ts-sdk';
import { COIN_ABI } from '../../abi/coin';
import { ABIRoot } from '../../types';
import { MovePrimitive } from '../../types/moveTypes';
import { createViewPayload } from '../createViewPayload';

// TODO: add struct, vector of vector
describe('createViewPayload', () => {
// Act before assertions
beforeAll(async () => { });
beforeAll(async () => {});

// Teardown (cleanup) after assertions
afterAll(() => { });
afterAll(() => {});

it('basic type checking', async () => {
// no need to run, type check only.
Expand Down Expand Up @@ -113,7 +116,7 @@ describe('createViewPayload', () => {
"returnTypes": [],
"typeParameters": [],
},
"function": "0x123::test::bool_as_input",
"function": "0x1::test::bool_as_input",
"functionArguments": [
true,
false,
Expand Down Expand Up @@ -154,7 +157,7 @@ describe('createViewPayload', () => {
"returnTypes": [],
"typeParameters": [],
},
"function": "0x123::test::address_as_input",
"function": "0x1::test::address_as_input",
"functionArguments": [
"0x1",
"0x2",
Expand Down Expand Up @@ -199,7 +202,7 @@ describe('createViewPayload', () => {
"returnTypes": [],
"typeParameters": [],
},
"function": "0x123::test::number_as_input",
"function": "0x1::test::number_as_input",
"functionArguments": [
1,
2,
Expand Down Expand Up @@ -249,7 +252,7 @@ describe('createViewPayload', () => {
"returnTypes": [],
"typeParameters": [],
},
"function": "0x123::test::vector_as_input",
"function": "0x1::test::vector_as_input",
"functionArguments": [
[
1,
Expand Down Expand Up @@ -278,10 +281,36 @@ describe('createViewPayload', () => {
}
`);
});
it('object', async () => {
const payload = createViewPayload(TEST_ABI, {
function: 'object_as_input',
functionArguments: [
'0xAddressType',
[0, 1, 2],
{
decimals: 8,
symbol: 'Aptos',
addressList: ['0x1', '0x2'],
},
],
typeArguments: [],
});

expect(payload.abi).toBeTruthy();
expect(payload.function).toBe('0x1::test::object_as_input');
expect(payload.functionArguments).toStrictEqual([
{ decimals: 8, symbol: 'Aptos', addressList: ['0x1', '0x2'] },
]);
expect(payload.abi?.parameters).toStrictEqual([
parseTypeTag('0x1::test::TestStruct'), //On abi the paramater its parsed as type tag for generation.
]);
expect(payload.abi?.returnTypes).toStrictEqual([]);
expect(payload.abi?.typeParameters).toStrictEqual([]);
});
});

const TEST_ABI = {
address: '0x123',
address: '0x1',
name: 'test',
friends: [],
exposed_functions: [
Expand Down Expand Up @@ -327,6 +356,36 @@ const TEST_ABI = {
],
return: [],
},
{
name: 'object_as_input',
visibility: 'public',
is_entry: false,
is_view: true,
generic_type_params: [],
params: ['address', 'vec<u8>', '0x1::test::TestStruct'],
return: [],
},
],
structs: [
{
abilities: ['copy', 'drop'],
name: 'TestStruct',
fields: [
{
name: 'symbol',
type: '0x1::string::String' satisfies MovePrimitive,
},
{
name: 'decimals',
type: 'u8' satisfies MovePrimitive,
},
{
name: 'addressList',
type: 'vector<address>' satisfies MovePrimitive,
},
],
generic_type_params: [],
is_native: false,
},
],
structs: [],
} as const;
} as const satisfies ABIRoot;
2 changes: 1 addition & 1 deletion src/core/__tests__/view.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ describe('call view functions', () => {
// struct FixedPoint64 has copy, drop, store { value: u128 }
const result = await clientMain.view({ payload: viewPayload });

result[0][0]!.inner;
result[0][0];

// @ts-expect-error
result[0][0].abc;
Expand Down
86 changes: 45 additions & 41 deletions src/types/convertor/argsConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,63 @@
* for input arguments of view function or entry function.
*/

import { AnyNumber, UnknownStruct } from '../common.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import { ABIRoot } from '../abi.js';
import { UnknownStruct } from '../common.js';
import {
ConvertedStruct,
ExtractStruct,
ExtractStructName,
} from '../extractor/struct.js';
import {
MoveNonStructTypes,
MovePrimitive,
MovePrimitivesMap,
MoveVector,
} from '../moveTypes.js';

/**
* Convert an array of input arguments type.
*/
export type ConvertArgs<T extends readonly string[]> = T extends readonly [
export type ConvertArgs<
Abi extends ABIRoot,
T extends readonly string[],
> = T extends readonly [
infer TArg extends string,
...infer TRest extends string[],
]
? [ConvertArgType<TArg>, ...ConvertArgs<TRest>]
? [ConvertArgType<Abi, TArg>, ...ConvertArgs<Abi, TRest>]
: [];

/**
* Internal
*/
type ConvertArgType<TMoveType extends string> =
TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructArgType<TMoveType>
: // it's a struct type
UnknownStruct<TMoveType>;
type ConvertArgType<
ABI extends ABIRoot,
TMoveType extends string,
> = TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructArgType<ABI, TMoveType>
: TMoveType extends MoveVector<infer TInner>
? ConvertArgType<ABI, TInner>[] // If it is a NON primitive vector, convert the inner type to argType[]
: // Verify if struct is a valid string, example 0x1::object_name::StructName and infer only StructName to a new type for validation
TMoveType extends ExtractStructName<ABI, infer StructName>
? ConvertedStruct<ABI, ExtractStruct<ABI, StructName>>
: UnknownStruct<TMoveType>;

type ConvertPrimitiveArgType<TMoveType extends MovePrimitive> =
TMoveType extends 'bool'
? boolean
: TMoveType extends 'u8'
? number
: TMoveType extends 'u16'
? number
: TMoveType extends 'u32'
? number
: TMoveType extends 'u64'
? AnyNumber
: TMoveType extends 'u128'
? AnyNumber
: TMoveType extends 'u256'
? AnyNumber
: TMoveType extends 'address'
? `0x${string}`
: TMoveType extends '0x1::string::String'
? string
: never;
MovePrimitivesMap[TMoveType];

type ConvertNonStructArgType<TMoveType extends MoveNonStructTypes> =
TMoveType extends MovePrimitive
? ConvertPrimitiveArgType<TMoveType>
: TMoveType extends `vector<u8>`
? string | number[] | Uint8Array
: TMoveType extends `vector<${infer TInner}>`
? ConvertArgType<TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? `0x${string}`
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertArgType<TInner> | undefined
: UnknownStruct<TMoveType>;
type ConvertNonStructArgType<
Abi extends ABIRoot,
TMoveType extends MoveNonStructTypes,
> = TMoveType extends MovePrimitive
? ConvertPrimitiveArgType<TMoveType>
: TMoveType extends `vector<u8>`
? string | number[] | Uint8Array
: TMoveType extends `vector<${infer TInner}>`
? ConvertArgType<Abi, TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? `0x${string}`
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertArgType<Abi, TInner> | undefined
: UnknownStruct<TMoveType>;
78 changes: 38 additions & 40 deletions src/types/convertor/returnConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,57 @@
* for return value of view functions.
*/

import { ABIRoot } from '../abi.js';
import { UnknownStruct } from '../common.js';
import { DefaultABITable } from '../defaultABITable.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import {
ConvertedStruct,
ExtractStruct,
ExtractStructName,
} from '../extractor/struct.js';
import {
MoveNonStructTypes,
MovePrimitive,
MovePrimitivesMap,
} from '../moveTypes.js';
import { ConvertStructFieldOptionType } from './structConvertor.js';

/**
* Convert an array of return types.
*/
export type ConvertReturns<T extends readonly string[]> = T extends readonly [
export type ConvertReturns<
ABI extends ABIRoot,
T extends readonly string[],
> = T extends readonly [
infer TArg extends string,
...infer TRest extends string[],
]
? [ConvertReturnType<TArg>, ...ConvertReturns<TRest>]
? [ConvertReturnType<ABI, TArg>, ...ConvertReturns<ABIRoot, TRest>]
: [];

/**
* Internal
*/
type ConvertReturnType<TMoveType extends string> =
TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructReturnType<TMoveType>
: // it's a struct type
UnknownStruct<TMoveType>;
type ConvertReturnType<
ABI extends ABIRoot,
TMoveType extends string,
> = TMoveType extends MoveNonStructTypes
? // it's a non-struct type
ConvertNonStructReturnType<ABI, TMoveType>
: // Verify if struct is a valid string, example 0x1::object_name::StructName and infer only StructName to a new type for validation
TMoveType extends ExtractStructName<ABI, infer StructName>
? ConvertedStruct<ABI, ExtractStruct<ABI, StructName>>
: UnknownStruct<TMoveType>;

type ConvertPrimitiveReturnType<TMoveType extends MovePrimitive> =
TMoveType extends 'bool'
? boolean
: TMoveType extends 'u8'
? number
: TMoveType extends 'u16'
? number
: TMoveType extends 'u32'
? number
: TMoveType extends 'u64'
? string
: TMoveType extends 'u128'
? string
: TMoveType extends 'u256'
? string
: TMoveType extends 'address'
? `0x${string}`
: TMoveType extends '0x1::string::String'
? string
: never;

type ConvertNonStructReturnType<TMoveType extends MoveNonStructTypes> =
TMoveType extends MovePrimitive
? ConvertPrimitiveReturnType<TMoveType>
: TMoveType extends `vector<${infer TInner}>`
? ConvertReturnType<TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? { inner: `0x${string}` }
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertStructFieldOptionType<DefaultABITable, TInner>
: UnknownStruct<TMoveType>;
type ConvertNonStructReturnType<
ABI extends ABIRoot,
TMoveType extends MoveNonStructTypes,
> = TMoveType extends MovePrimitive
? MovePrimitivesMap[TMoveType]
: TMoveType extends `vector<${infer TInner}>`
? ConvertReturnType<ABI, TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? { inner: `0x${string}` }
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertStructFieldOptionType<DefaultABITable, TInner>
: UnknownStruct<TMoveType>;
31 changes: 6 additions & 25 deletions src/types/convertor/structConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import {
ExtractStructType,
ResourceStructName,
} from '../extractor/structExtractor.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import {
MoveNonStructTypes,
MovePrimitive,
MovePrimitivesMap,
} from '../moveTypes.js';

// Convert a struct field Move type to a TypeScript type
export type ConvertStructFieldType<
Expand All @@ -19,35 +23,12 @@ export type ConvertStructFieldType<
: // it's a struct type
ConvertStructFieldStructType<TABITable, TMoveType>;

/**
* Internal
*/
type ConvertPrimitiveStructField<T extends MovePrimitive> = T extends 'bool'
? boolean
: T extends 'u8'
? number
: T extends 'u16'
? number
: T extends 'u32'
? number
: T extends 'u64'
? string
: T extends 'u128'
? string
: T extends 'u256'
? string
: T extends 'address'
? `0x${string}`
: T extends '0x1::string::String'
? string
: never;

// Convert a struct field non-struct Move type to a TypeScript type
type ConvertStructFieldNonStructType<
TABITable extends ABITable,
TMoveType extends MoveNonStructTypes,
> = TMoveType extends MovePrimitive
? ConvertPrimitiveStructField<TMoveType>
? MovePrimitivesMap[TMoveType]
: TMoveType extends `vector<${infer TInner}>`
? ConvertStructFieldType<TABITable, TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
Expand Down
Loading