Skip to content

Commit

Permalink
support 0x1::object::Object and 0x1::option::Option for view function…
Browse files Browse the repository at this point in the history
… returns (#182)
  • Loading branch information
SamuelQZQ authored Aug 8, 2024
1 parent 6113067 commit fa03792
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 30 deletions.
5 changes: 5 additions & 0 deletions .changeset/flat-sheep-repair.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@thalalabs/surf': patch
---

support 0x1::object::Object and 0x1::option::Option for view function returns
88 changes: 77 additions & 11 deletions src/core/__tests__/view.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,17 @@ import { createViewPayload } from '../createViewPayload.js';

describe('call view functions', () => {
const client = createSurfClient(
new Aptos(
new AptosConfig({ network: Network.TESTNET })
)
new Aptos(new AptosConfig({ network: Network.TESTNET })),
);

const clientMain = createSurfClient(
new Aptos(
new AptosConfig({ network: Network.MAINNET })
)
new Aptos(new AptosConfig({ network: Network.MAINNET })),
);
// Act before assertions
beforeAll(async () => { });
beforeAll(async () => {});

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

it('basic', async () => {
const viewPayload = createViewPayload(COIN_ABI, {
Expand Down Expand Up @@ -58,9 +54,10 @@ describe('call view functions', () => {
typeArguments: ['0x1::aptos_coin::AptosCoin'],
});
const result = await client.view({
payload: viewPayload, options: {
payload: viewPayload,
options: {
ledgerVersion: 562606728,
}
},
});
expect(result).toMatchInlineSnapshot(`
[
Expand All @@ -83,6 +80,49 @@ describe('call view functions', () => {
expect((result[0] as any).v).toBeDefined();
expect(typeof (result[0] as any).v).toEqual('string');
}, 60000);

it('return objects', async () => {
// no need to run, type check only.
async () => {
const viewPayload = createViewPayload(TIERED_ORACLE_ABI, {
function: 'get_objects',
functionArguments: [],
typeArguments: ['0x1::aptos_coin::AptosCoin'],
});

// The declaration in Move:
// struct FixedPoint64 has copy, drop, store { value: u128 }
const result = await clientMain.view({ payload: viewPayload });

result[0][0]!.inner;

// @ts-expect-error
result[0][0].abc;
};
}, 60000);

it('return options', async () => {
// no need to run, type check only.
async () => {
const viewPayload = createViewPayload(TIERED_ORACLE_ABI, {
function: 'get_options',
functionArguments: [],
typeArguments: ['0x1::aptos_coin::AptosCoin'],
});

// The declaration in Move:
// struct FixedPoint64 has copy, drop, store { value: u128 }
const result = await clientMain.view({ payload: viewPayload });

result[0][0]!.vec[0];

// @ts-expect-error out of range, option only has 0 or 1 item
result[0][0]!.vec[1];

// @ts-expect-error
result[0][0].abc;
};
}, 60000);
});

const TIERED_ORACLE_ABI = {
Expand All @@ -107,6 +147,32 @@ const TIERED_ORACLE_ABI = {
'0x4dcae85fc5559071906cd5c76b7420fcbb4b0a92f00ab40ffc394aadbbff5ee9::fixed_point64::FixedPoint64',
],
},
{
name: 'get_objects',
visibility: 'public',
is_entry: false,
is_view: true,
generic_type_params: [
{
constraints: [],
},
],
params: [],
return: ['vector<0x1::object::Object<0x123::abc::Abc>>'],
},
{
name: 'get_options',
visibility: 'public',
is_entry: false,
is_view: true,
generic_type_params: [
{
constraints: [],
},
],
params: [],
return: ['vector<0x1::option::Option<0x123::abc::Abc>>'],
},
],
structs: [],
} as const;
42 changes: 24 additions & 18 deletions src/types/convertor/returnConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
*/

import { UnknownStruct } from '../common.js';
import { DefaultABITable } from '../defaultABITable.js';
import { MoveNonStructTypes, MovePrimitive } from '../moveTypes.js';
import { ConvertStructFieldOptionType } from './structConvertor.js';

/**
* Convert an array of return types.
Expand All @@ -30,26 +32,30 @@ 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;
? 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>[]
: UnknownStruct<TMoveType>;
? ConvertReturnType<TInner>[]
: TMoveType extends `0x1::object::Object<${string}>`
? { inner: `0x${string}` }
: TMoveType extends `0x1::option::Option<${infer TInner}>`
? ConvertStructFieldOptionType<DefaultABITable, TInner>
: UnknownStruct<TMoveType>;
2 changes: 1 addition & 1 deletion src/types/convertor/structConvertor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ type ConvertStructFieldNonStructType<
? ConvertStructFieldOptionType<TABITable, TInner>
: UnknownStruct<TMoveType>;

type ConvertStructFieldOptionType<
export type ConvertStructFieldOptionType<
TABITable extends ABITable,
TMoveType extends string,
> = {
Expand Down

0 comments on commit fa03792

Please sign in to comment.