Skip to content

Commit

Permalink
refactor: simulate contract return type
Browse files Browse the repository at this point in the history
  • Loading branch information
tmm committed Sep 6, 2023
1 parent 17f55f3 commit 1692121
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 25 deletions.
4 changes: 4 additions & 0 deletions src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ export {
type ReadContractReturnType,
readContract,
} from './public/readContract.js'
export {
type GetAddressesReturnType,
getAddresses,
} from './wallet/getAddresses.js'
export {
type GetPermissionsReturnType,
getPermissions,
Expand Down
13 changes: 12 additions & 1 deletion src/actions/public/simulateContract.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { parseAbi } from 'abitype'
import { assertType, test } from 'vitest'
import { assertType, expectTypeOf, test } from 'vitest'

import { wagmiContractConfig } from '../../_test/abis.js'
import { publicClient } from '../../_test/utils.js'
Expand Down Expand Up @@ -123,6 +123,9 @@ test('overloads', async () => {
functionName: 'foo',
})
assertType<number>(res1.result)
expectTypeOf(res1.request.abi).toEqualTypeOf(
parseAbi(['function foo() returns (int8)']),
)

const res2 = await simulateContract(publicClient, {
address: '0x',
Expand All @@ -131,6 +134,9 @@ test('overloads', async () => {
args: ['0x'],
})
assertType<string>(res2.result)
expectTypeOf(res2.request.abi).toEqualTypeOf(
parseAbi(['function foo(address) returns (string)']),
)

const res3 = await simulateContract(publicClient, {
address: '0x',
Expand All @@ -142,4 +148,9 @@ test('overloads', async () => {
foo: `0x${string}`
bar: `0x${string}`
}>(res3.result)
expectTypeOf(res3.request.abi).toEqualTypeOf(
parseAbi([
'function foo(address, address) returns ((address foo, address bar))',
]),
)
})
62 changes: 40 additions & 22 deletions src/actions/public/simulateContract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ import type {
ContractFunctionName,
ContractFunctionParameters,
ContractFunctionReturnType,
ExtractAbiFunctionForArgs,
GetValue,
} from '../../types/contract.js'
import type { Hex } from '../../types/misc.js'
import type { UnionOmit } from '../../types/utils.js'
import type { Prettify, UnionEvaluate, UnionOmit } from '../../types/utils.js'
import { decodeFunctionResult } from '../../utils/abi/decodeFunctionResult.js'
import { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js'
import { getContractError } from '../../utils/errors/getContractError.js'
Expand Down Expand Up @@ -69,32 +70,45 @@ export type SimulateContractReturnType<
> = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,
chain extends Chain | undefined = Chain | undefined,
chainOverride extends Chain | undefined = Chain | undefined,
///
minimizedAbi extends Abi = readonly [
ExtractAbiFunctionForArgs<
abi extends Abi ? abi : Abi,
'nonpayable' | 'payable',
functionName,
args
>,
],
> = {
result: ContractFunctionReturnType<
abi,
minimizedAbi,
'nonpayable' | 'payable',
functionName,
args
>
request: UnionOmit<
WriteContractParameters<
abi,
functionName,
args,
chain,
undefined,
chainOverride
>,
'chain' | 'functionName'
> & {
chain: chainOverride
functionName: functionName
} & ContractFunctionParameters<
abi,
'nonpayable' | 'payable',
functionName,
args
>
request: Prettify<
UnionEvaluate<
UnionOmit<
WriteContractParameters<
minimizedAbi,
functionName,
args,
chain,
undefined,
chainOverride
>,
'abi' | 'args' | 'chain' | 'functionName'
>
> &
ContractFunctionParameters<
minimizedAbi,
'nonpayable' | 'payable',
functionName,
args
> & {
chain: chainOverride
}
>
}

/**
Expand Down Expand Up @@ -170,10 +184,14 @@ export async function simulateContract<
functionName,
data: data || '0x',
})
const minimizedAbi = abi.filter(
(abiItem) =>
'name' in abiItem && abiItem.name === parameters.functionName,
)
return {
result,
request: {
abi,
abi: minimizedAbi,
address,
args,
dataSuffix,
Expand Down
3 changes: 1 addition & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ export {
type AbiParameterKind,
type AbiParameterToPrimitiveType,
type Address,
type ExtractAbiFunction,
type ExtractAbiFunctionNames,
type Narrow,
type ParseAbi,
type ParseAbiItem,
Expand Down Expand Up @@ -561,6 +559,7 @@ export { SizeExceedsPaddingSizeError } from './errors/data.js'
export { UrlRequiredError } from './errors/transport.js'
export type {
AbiItem,
ExtractAbiFunctionForArgs,
ContractErrorArgs,
ContractErrorName,
ContractEventArgs,
Expand Down

0 comments on commit 1692121

Please sign in to comment.