Skip to content

Commit eefaa74

Browse files
authored
chore: deprecate helpers related to InvocationScope (#3920)
1 parent 55ad003 commit eefaa74

4 files changed

Lines changed: 177 additions & 50 deletions

File tree

.changeset/lazy-coins-tease.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@fuel-ts/program": patch
3+
---
4+
5+
chore: deprecate helpers related to `InvocationScope`

packages/program/src/contract-call-script.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,19 @@ const scriptResultDecoder = (contractId: Address) => (result: ScriptResult) => {
140140
});
141141
};
142142

143-
export const decodeContractCallScriptResult = (
144-
callResult: CallResult,
145-
contractId: Address,
146-
logs: DecodedLogs<any>['logs'] = [],
147-
groupedLogs: DecodedLogs<any>['groupedLogs'] = {},
148-
abis?: JsonAbisFromAllCalls
149-
): Uint8Array[] =>
150-
decodeCallResult(callResult, scriptResultDecoder(contractId), logs, groupedLogs, abis);
143+
export const decodeContractCallScriptResult = (params: {
144+
callResult: CallResult;
145+
contractId: Address;
146+
logs?: DecodedLogs<any>['logs'];
147+
groupedLogs: DecodedLogs<any>['groupedLogs'];
148+
abis?: JsonAbisFromAllCalls;
149+
}): Uint8Array[] => {
150+
const { contractId, ...rest } = params;
151+
return decodeCallResult({
152+
...rest,
153+
scriptResultDecoder: scriptResultDecoder(contractId),
154+
});
155+
};
151156

152157
const getCallInstructionsLength = (contractCalls: ContractCall[]): number =>
153158
contractCalls.reduce(

packages/program/src/response.ts

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,103 @@ import type {
2222
} from './types';
2323
import { getAbisFromAllCalls, getAllResultLogs } from './utils';
2424

25-
/** @hidden */
26-
export const extractInvocationResult = <T>(
25+
export type ExtractInvocationResultParams = {
26+
functionScopes: Array<InvocationScopeLike>;
27+
receipts: TransactionResultReceipt[];
28+
isMultiCall: boolean;
29+
logs?: DecodedLogs<unknown>['logs'];
30+
groupedLogs?: DecodedLogs<unknown>['groupedLogs'];
31+
abis?: JsonAbisFromAllCalls;
32+
};
33+
34+
/**
35+
* Extracts the invocation result from an invocation call.
36+
*
37+
* @template T - The type of the result to be extracted.
38+
* @param functionScopes - An array of invocation scopes.
39+
* @param receipts - The transaction result receipts.
40+
* @param isMultiCall - A boolean indicating if the call is a multi-call.
41+
* @param logs - Optional logs associated with the transaction.
42+
* @param groupedLogs - Optional grouped logs associated with the transaction.
43+
* @param abis - Optional ABIs associated with the transaction.
44+
* @returns The extracted invocation result of type T.
45+
*
46+
* @deprecated Use the object-based approach for parameters instead.
47+
*/
48+
export function extractInvocationResult<T>(
2749
functionScopes: Array<InvocationScopeLike>,
2850
receipts: TransactionResultReceipt[],
2951
isMultiCall: boolean,
30-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
31-
logs: DecodedLogs<any>['logs'],
32-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
33-
groupedLogs: DecodedLogs<any>['groupedLogs'] = {},
52+
logs?: DecodedLogs<unknown>['logs'],
53+
groupedLogs?: DecodedLogs<unknown>['groupedLogs'],
3454
abis?: JsonAbisFromAllCalls
35-
) => {
55+
): T;
56+
57+
/**
58+
* Extracts the invocation result from a invocation call.
59+
*
60+
* @template T - The type of the result to be extracted.
61+
* @param params - Object of type `ExtractInvocationResultParams` containing extraction parameters
62+
*/
63+
export function extractInvocationResult<T>(params: ExtractInvocationResultParams): T;
64+
65+
export function extractInvocationResult<T>(
66+
paramsOrFunctionScopes: ExtractInvocationResultParams | Array<InvocationScopeLike>,
67+
_receipts?: TransactionResultReceipt[],
68+
_isMultiCall?: boolean,
69+
_logs?: DecodedLogs<unknown>['logs'],
70+
_groupedLogs?: DecodedLogs<unknown>['groupedLogs'],
71+
_abis?: JsonAbisFromAllCalls
72+
): T {
73+
let functionScopes: Array<InvocationScopeLike>;
74+
let receipts: TransactionResultReceipt[];
75+
let isMultiCall: boolean;
76+
let logs: DecodedLogs<unknown>['logs'];
77+
let groupedLogs: DecodedLogs<unknown>['groupedLogs'];
78+
let abis: JsonAbisFromAllCalls | undefined;
79+
80+
if (typeof paramsOrFunctionScopes === 'object' && !Array.isArray(paramsOrFunctionScopes)) {
81+
functionScopes = paramsOrFunctionScopes.functionScopes;
82+
receipts = paramsOrFunctionScopes.receipts;
83+
isMultiCall = paramsOrFunctionScopes.isMultiCall;
84+
logs = paramsOrFunctionScopes.logs ?? [];
85+
groupedLogs = paramsOrFunctionScopes.groupedLogs ?? {};
86+
abis = paramsOrFunctionScopes.abis;
87+
} else {
88+
functionScopes = paramsOrFunctionScopes;
89+
receipts = _receipts as TransactionResultReceipt[];
90+
isMultiCall = _isMultiCall as boolean;
91+
logs = _logs ?? [];
92+
groupedLogs = _groupedLogs ?? {};
93+
abis = _abis;
94+
}
95+
3696
const mainCallConfig = functionScopes[0]?.getCallConfig();
3797

3898
if (functionScopes.length === 1 && mainCallConfig && 'bytes' in mainCallConfig.program) {
39-
return callResultToInvocationResult<T>({ receipts }, mainCallConfig, logs, groupedLogs, abis);
99+
return callResultToInvocationResult<T>({
100+
callResult: { receipts },
101+
call: mainCallConfig,
102+
logs,
103+
groupedLogs,
104+
abis,
105+
});
40106
}
41-
const encodedResults = decodeContractCallScriptResult(
42-
{ receipts },
43-
(mainCallConfig?.program as AbstractContract).id,
107+
const encodedResults = decodeContractCallScriptResult({
108+
callResult: { receipts },
109+
contractId: (mainCallConfig?.program as AbstractContract).id,
44110
logs,
45111
groupedLogs,
46-
abis
47-
);
112+
abis,
113+
});
48114

49115
const decodedResults = encodedResults.map((encodedResult, i) => {
50116
const { func } = functionScopes[i].getCallConfig();
51117
return func.decodeOutput(encodedResult)?.[0];
52118
});
53119

54120
return (isMultiCall ? decodedResults : decodedResults?.[0]) as T;
55-
};
121+
}
56122

57123
type BuiltFunctionResultParams = {
58124
funcScope: InvocationScopeLike | Array<InvocationScopeLike>;

packages/program/src/script-request.ts

Lines changed: 79 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -90,25 +90,26 @@ function callResultToScriptResult(callResult: CallResult): ScriptResult {
9090
return scriptResult;
9191
}
9292

93+
type DecodeCallResultParams<TResult> = {
94+
callResult: CallResult;
95+
scriptResultDecoder: (scriptResult: ScriptResult) => TResult;
96+
logs?: DecodedLogs['logs'];
97+
groupedLogs?: DecodedLogs['groupedLogs'];
98+
abis?: JsonAbisFromAllCalls;
99+
};
100+
93101
/**
94-
* Decodes a CallResult using the provided decoder function.
102+
* Decodes a CallResult using the provided options.
95103
*
96-
* @param callResult - The CallResult to decode.
97-
* @param decoder - The decoding function to apply on the ScriptResult.
98-
* @param logs - Optional logs associated with the decoding.
104+
* @param params - The options to decode the CallResult.
99105
* @returns The decoded result.
100106
* @throws Throws an error if decoding fails.
101107
*/
102-
export function decodeCallResult<TResult>(
103-
callResult: CallResult,
104-
decoder: (scriptResult: ScriptResult) => TResult,
105-
logs: DecodedLogs['logs'] = [],
106-
groupedLogs: DecodedLogs['groupedLogs'] = {},
107-
abis?: JsonAbisFromAllCalls
108-
): TResult {
108+
export function decodeCallResult<TResult>(params: DecodeCallResultParams<TResult>): TResult {
109+
const { callResult, scriptResultDecoder, logs = [], groupedLogs = {}, abis } = params;
109110
try {
110111
const scriptResult = callResultToScriptResult(callResult);
111-
return decoder(scriptResult);
112+
return scriptResultDecoder(scriptResult);
112113
} catch (error) {
113114
if ((<FuelError>error).code === ErrorCode.SCRIPT_REVERTED) {
114115
const statusReason = (<DryRunFailureStatusFragment>callResult?.dryRunStatus)?.reason;
@@ -125,24 +126,27 @@ export function decodeCallResult<TResult>(
125126
}
126127
}
127128

129+
export type CallResultToInvocationResultParams = {
130+
callResult: CallResult;
131+
call: CallConfig;
132+
logs?: DecodedLogs<unknown>['logs'];
133+
groupedLogs?: DecodedLogs<unknown>['groupedLogs'];
134+
abis?: JsonAbisFromAllCalls;
135+
};
136+
128137
/**
129-
* Converts a CallResult to an invocation result based on the provided call configuration.
138+
* Decodes a CallResult using the provided options.
130139
*
131-
* @param callResult - The CallResult from the script call.
132-
* @param call - The call configuration.
133-
* @param logs - Optional logs associated with the decoding.
140+
* @param params - The parameters to decode the CallResult.
134141
* @returns The decoded invocation result.
135142
*/
136143
export function callResultToInvocationResult<TReturn>(
137-
callResult: CallResult,
138-
call: CallConfig,
139-
logs?: DecodedLogs<unknown>['logs'],
140-
groupedLogs?: DecodedLogs<unknown>['groupedLogs'],
141-
abis?: JsonAbisFromAllCalls
144+
params: CallResultToInvocationResultParams
142145
): TReturn {
143-
return decodeCallResult(
146+
const { callResult, call, logs = [], groupedLogs = {}, abis } = params;
147+
return decodeCallResult({
144148
callResult,
145-
(scriptResult: ScriptResult) => {
149+
scriptResultDecoder: (scriptResult: ScriptResult) => {
146150
if (scriptResult.returnReceipt.type === ReceiptType.Revert) {
147151
throw new FuelError(
148152
ErrorCode.SCRIPT_REVERTED,
@@ -178,8 +182,8 @@ export function callResultToInvocationResult<TReturn>(
178182
},
179183
logs,
180184
groupedLogs,
181-
abis
182-
);
185+
abis,
186+
});
183187
}
184188

185189
export type EncodedScriptCall = Uint8Array | { data: Uint8Array; script: Uint8Array };
@@ -266,11 +270,58 @@ export class ScriptRequest<TData = void, TResult = void> {
266270
/**
267271
* Decodes the result of a script call.
268272
*
269-
* @param callResult - The CallResult from the script call.
273+
* @param callResultOrParams - The CallResult from the script call.
270274
* @param logs - Optional logs associated with the decoding.
275+
* @param groupedLogs - Optional grouped logs associated with the decoding.
276+
* @param abis - Optional abis associated with the decoding.
277+
* @returns The decoded result.
278+
*
279+
* @deprecated Use the object-based approach for parameters instead.
280+
*/
281+
decodeCallResult(
282+
callResult: CallResult,
283+
logs?: Array<any>,
284+
groupedLogs?: DecodedLogs['groupedLogs'],
285+
abis?: JsonAbisFromAllCalls
286+
): TResult;
287+
288+
/**
289+
* Decodes the result of a script call.
290+
*
291+
* @param params - The parameters to decode the CallResult.
271292
* @returns The decoded result.
272293
*/
273-
decodeCallResult(callResult: CallResult, logs: Array<any> = []): TResult {
274-
return decodeCallResult(callResult, this.scriptResultDecoder, logs);
294+
decodeCallResult(params: Omit<DecodeCallResultParams<TResult>, 'scriptResultDecoder'>): TResult;
295+
296+
decodeCallResult(
297+
callResultOrParams: CallResult | Omit<DecodeCallResultParams<TResult>, 'scriptResultDecoder'>,
298+
_logs?: Array<any>,
299+
_groupedLogs?: DecodedLogs['groupedLogs'],
300+
_abis?: JsonAbisFromAllCalls
301+
): TResult {
302+
let callResult: CallResult;
303+
let logs: Array<any>;
304+
let groupedLogs: DecodedLogs['groupedLogs'];
305+
let abis: JsonAbisFromAllCalls | undefined;
306+
307+
if (typeof callResultOrParams === 'object' && 'callResult' in callResultOrParams) {
308+
callResult = callResultOrParams.callResult as CallResult;
309+
logs = callResultOrParams.logs ?? [];
310+
groupedLogs = callResultOrParams.groupedLogs ?? {};
311+
abis = callResultOrParams.abis;
312+
} else {
313+
callResult = callResultOrParams as CallResult;
314+
logs = _logs ?? [];
315+
groupedLogs = _groupedLogs ?? {};
316+
abis = _abis;
317+
}
318+
319+
return decodeCallResult({
320+
callResult,
321+
scriptResultDecoder: this.scriptResultDecoder,
322+
logs,
323+
groupedLogs,
324+
abis,
325+
});
275326
}
276327
}

0 commit comments

Comments
 (0)