From 6e52bab836b2e49fdb1785f27c22692a3eec115d Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Thu, 31 Oct 2024 19:45:15 +0800 Subject: [PATCH 1/3] fix: contract class splitArgsAndOptions --- src/contract/default.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/contract/default.ts b/src/contract/default.ts index 221d2c448..46afd14f1 100644 --- a/src/contract/default.ts +++ b/src/contract/default.ts @@ -5,6 +5,7 @@ import { ProviderInterface, defaultProvider } from '../provider'; import { Abi, AbiEvents, + AbiStruct, ArgsOrCalldata, ArgsOrCalldataWithOptions, AsyncContractFunction, @@ -21,7 +22,6 @@ import { ParsedEvents, RawArgs, Result, - AbiStruct, ValidateType, } from '../types'; import assert from '../utils/assert'; @@ -29,8 +29,8 @@ import { CallData, cairo } from '../utils/calldata'; import { createAbiParser } from '../utils/calldata/parser'; import { getAbiEvents, parseEvents as parseRawEvents } from '../utils/events/index'; import { cleanHex } from '../utils/num'; -import { ContractInterface } from './interface'; import type { GetTransactionReceiptResponse } from '../utils/transactionReceipt'; +import { ContractInterface } from './interface'; export type TypedContractV2 = AbiWanTypedContract & Contract; @@ -46,7 +46,7 @@ export const splitArgsAndOptions = (args: ArgsOrCalldataWithOptions) => { 'addressSalt', ]; const lastArg = args[args.length - 1]; - if (typeof lastArg === 'object' && options.some((x) => x in lastArg)) { + if (typeof lastArg === 'object' && !Array.isArray(lastArg) && options.some((x) => x in lastArg)) { return { args: args as ArgsOrCalldata, options: args.pop() as ContractOptions }; } return { args: args as ArgsOrCalldata }; From 23e80b75dccd3e159bc98795b329ca213b3d3cf5 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Fri, 1 Nov 2024 21:38:21 +0800 Subject: [PATCH 2/3] fix: type ArgsOrCalldataWithOptions --- src/contract/default.ts | 2 +- src/types/contract.ts | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/contract/default.ts b/src/contract/default.ts index 46afd14f1..ca60a24d7 100644 --- a/src/contract/default.ts +++ b/src/contract/default.ts @@ -70,7 +70,7 @@ function buildCall(contract: Contract, functionAbi: FunctionAbi): AsyncContractF * Adds invoke methods to the contract */ function buildInvoke(contract: Contract, functionAbi: FunctionAbi): AsyncContractFunction { - return async function (...args: Array): Promise { + return async function (...args: ArgsOrCalldataWithOptions): Promise { const params = splitArgsAndOptions(args); return contract.invoke(functionAbi.name, params.args, { parseRequest: true, diff --git a/src/types/contract.ts b/src/types/contract.ts index 01dacf9b0..8624df75d 100644 --- a/src/types/contract.ts +++ b/src/types/contract.ts @@ -21,8 +21,37 @@ export type Result = | boolean | CairoEnum; -export type ArgsOrCalldata = RawArgsArray | [Calldata] | Calldata; -export type ArgsOrCalldataWithOptions = ArgsOrCalldata & ContractOptions; +// export type ArgsOrCalldata = RawArgsArray | [Calldata] | Calldata; +// export type ArgsOrCalldataWithOptions = ArgsOrCalldata & ContractOptions; + +// RawParamsOrCalldata as args +export type ArgsOrCalldata = + // params like (va,vb,vc,vd...) as args is [va,vb,vc,vd...] + // params like (x) where x = {a:va,b:vb,c:vc...} as args is [x] + // params like (x) where x = [va,vb,vc...] as args is [[x]] + | RawArgsArray // recursive definition cover all this cases + // [calldata] is [['0x','0x'...]] + | [Calldata] + // calldata is ['0x','0x'...] + | Calldata; + +// RawParamsOrCalldata where each can have an option +export type ArgsOrCalldataWithOptions = + // params like (va,vb,vc,vd..., option) as args is [va,vb,vc,vd..., option] + // params like (x, option) where x = {a:va,b:vb,c:vc...} as args is [x, option] + // params like (x, option) where x = [va,vb,vc...] as args is [[x], option] + // recursive definition cover all this cases + | [...RawArgsArray] + | [...RawArgsArray, ContractOptions] + // used when called compile that return array of calldata + // (calldata, options) as args is [['0x','0x'...], options] + | [Calldata] + | [Calldata, ContractOptions] + // used when separate params compilations + // (c,a,l,l,d,a,t,a, options) as args is ['0x','0x'..., options] + | [...Calldata] + | [...Calldata, ContractOptions]; + export type ContractOptions = { blockIdentifier?: BlockIdentifier; parseRequest?: boolean; From b3c01f9eac121a278ba429b8b4db36c0136efac2 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Fri, 1 Nov 2024 23:34:21 +0800 Subject: [PATCH 3/3] chore: restore false fix --- src/contract/default.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contract/default.ts b/src/contract/default.ts index ca60a24d7..f9102ba84 100644 --- a/src/contract/default.ts +++ b/src/contract/default.ts @@ -46,7 +46,7 @@ export const splitArgsAndOptions = (args: ArgsOrCalldataWithOptions) => { 'addressSalt', ]; const lastArg = args[args.length - 1]; - if (typeof lastArg === 'object' && !Array.isArray(lastArg) && options.some((x) => x in lastArg)) { + if (typeof lastArg === 'object' && options.some((x) => x in lastArg)) { return { args: args as ArgsOrCalldata, options: args.pop() as ContractOptions }; } return { args: args as ArgsOrCalldata };