diff --git a/.changeset/chatty-boxes-speak.md b/.changeset/chatty-boxes-speak.md new file mode 100644 index 0000000..f27b644 --- /dev/null +++ b/.changeset/chatty-boxes-speak.md @@ -0,0 +1,5 @@ +--- +'@thalalabs/surf': patch +--- + +Support 0x1::object::Object diff --git a/src/core/__tests__/createEntryPayload.test.ts b/src/core/__tests__/createEntryPayload.test.ts index 0c9febb..fca9024 100644 --- a/src/core/__tests__/createEntryPayload.test.ts +++ b/src/core/__tests__/createEntryPayload.test.ts @@ -182,6 +182,14 @@ describe('createEntryPayload', () => { }); } }); + + it('0x1::object::Object', async () => { + createEntryPayload(TEST_ABI, { + function: 'object_as_input', + arguments: ["0x123456"], + type_arguments: [], + }); + }); }); const TEST_ABI = { @@ -256,6 +264,17 @@ const TEST_ABI = { ], "return": [] }, + { + "name": "object_as_input", + "visibility": "public", + "is_entry": true, + "is_view": false, + "generic_type_params": [], + "params": [ + "0x1::object::Object<0xb8a4015d231899eaf1de8eb6dc6547f296f215b7ca46ea01b22b3d1ba24b6eb1::overflow::Overflow>", + ], + "return": [] + }, ], "structs": [] diff --git a/src/core/createEntryPayload.ts b/src/core/createEntryPayload.ts index e2cdf32..5eaee8a 100644 --- a/src/core/createEntryPayload.ts +++ b/src/core/createEntryPayload.ts @@ -86,10 +86,10 @@ export function createEntryPayload< function argToBCS(type: string, arg: any, serializer: BCS.Serializer) { - const regex = /vector<([^]+)>/; - const match = type.match(regex); - if (match) { // It's vector - const innerType = match[1]!; + const vectorRegex = /vector<([^]+)>/; + const vectorMatch = type.match(vectorRegex); + if (vectorMatch) { // It's vector + const innerType = vectorMatch[1]!; if (innerType === 'u8') { if (arg instanceof Uint8Array) { // TODO: add type support for Uint8Array serializer.serializeBytes(arg); @@ -112,6 +112,13 @@ function argToBCS(type: string, arg: any, serializer: BCS.Serializer) { return; } + const objectRegex = /0x1::object::Object<([^]+)>/; + const objectMatch = type.match(objectRegex); + if (objectMatch) { // It's 0x1::object::Object + TxnBuilderTypes.AccountAddress.fromHex(arg as string).serialize(serializer); + return; + } + switch (type) { // It's primitive case 'bool': serializer.serializeBool(ensureBoolean(arg)); diff --git a/src/types/common.ts b/src/types/common.ts index dcef546..b22db91 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -8,9 +8,10 @@ export type Primitive = type Vector = `vector<${string}>`; type VectorOfVector = `vector>`; +type MoveObject = `0x1::object::Object<${string}>` // TODO: support vector> -export type AllTypes = Primitive | Vector | VectorOfVector; +export type AllTypes = Primitive | Vector | VectorOfVector | MoveObject; type ConvertPrimitiveArgsType = T extends 'bool' ? boolean : T extends 'u8' ? number : @@ -35,6 +36,7 @@ type ConvertVectorArgsType = TInner extends Primitive ? ConvertPrimitive export type ConvertArgsType = T extends Primitive ? ConvertPrimitiveArgsType : T extends `vector<${infer TInner}>` ? ConvertVectorArgsType : + T extends `0x1::object::Object<${string}>` ? `0x${string}` : Struct; //@ts-ignore TODO: remove this ignore