Skip to content

Commit

Permalink
feat: sendTransaction
Browse files Browse the repository at this point in the history
  • Loading branch information
tmm committed Jul 11, 2023
1 parent cd95c0b commit ca8153c
Show file tree
Hide file tree
Showing 43 changed files with 998 additions and 147 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"rome": "^12.1.0",
"simple-git-hooks": "^2.8.1",
"typescript": "^5.0.4",
"viem": "1.2.7",
"viem": "1.2.12",
"vite": "^4.3.2",
"vitest": "^0.31.0"
},
Expand All @@ -55,7 +55,7 @@
"@wagmi/core": "workspace:*",
"remark-shiki-twoslash>shiki": "^0.14.1",
"shiki-twoslash>shiki": "^0.14.1",
"viem": "1.2.7"
"viem": "1.2.12"
},
"patchedDependencies": {
"@coinbase/wallet-sdk@3.7.1": "patches/@coinbase__wallet-sdk@3.7.1.patch",
Expand Down
17 changes: 17 additions & 0 deletions packages/core/src/actions/getConnectorClient.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { config, testChains } from '@wagmi/test'
import { expectTypeOf, test } from 'vitest'

import { getConnectorClient } from './getConnectorClient.js'

test('default', async () => {
const client = await getConnectorClient(config)
expectTypeOf(client.chain).toEqualTypeOf<typeof config['chains'][number]>()
})

test('chainId', async () => {
const client = await getConnectorClient(config, {
chainId: testChains.anvil.id,
})
expectTypeOf(client.chain).toEqualTypeOf<typeof testChains.anvil>()
expectTypeOf(client.chain).not.toEqualTypeOf<typeof testChains.anvilTwo>()
})
14 changes: 6 additions & 8 deletions packages/core/src/actions/getConnectorClient.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {
type Account,
type Chain,
type Client,
type Transport,
createClient,
Expand All @@ -23,12 +22,9 @@ export type GetConnectorClientReturnType<
> = Evaluate<
Client<
Transport,
Extract<
config['chains'][number],
{ id: chainId }
> extends infer chain extends Chain
? chain
: Chain,
chainId extends config['chains'][number]['id']
? Extract<config['chains'][number], { id: chainId }>
: config['chains'][number],
Account
>
>
Expand All @@ -39,8 +35,10 @@ export async function getConnectorClient<
chainId extends config['chains'][number]['id'],
>(
config: config,
{ chainId }: GetConnectorClientParameters<config, chainId> = {},
parameters: GetConnectorClientParameters<config, chainId> = {},
): Promise<GetConnectorClientReturnType<config, chainId>> {
const { chainId } = parameters

const connection = config.state.connections.get(config.state.current!)
if (!connection) throw new ConnectorNotFoundError()

Expand Down
24 changes: 21 additions & 3 deletions packages/core/src/actions/getTransaction.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,34 @@
import { http } from 'viem'
import { celo, mainnet } from 'viem/chains'
import { expectTypeOf, test } from 'vitest'

import { createConfig } from '../config.js'
import { getTransaction } from './getTransaction.js'
import { http } from 'viem'
import { celo } from 'viem/chains'

test('chain formatters', async () => {
const config = createConfig({
chains: [celo, mainnet],
transports: { [celo.id]: http(), [mainnet.id]: http() },
})
const result = await getTransaction(config, { hash: '0x123' })
if ('feeCurrency' in result) {
expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()
expectTypeOf(result.gatewayFee).toEqualTypeOf<bigint | null>()
expectTypeOf(result.gatewayFeeRecipient).toEqualTypeOf<
`0x${string}` | null
>()
}
})

test('chainId', async () => {
const config = createConfig({
chains: [celo],
transports: { [celo.id]: http() },
})
const result = await getTransaction(config, { hash: '0x123' })
const result = await getTransaction(config, {
hash: '0x123',
chainId: celo.id,
})
expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()
expectTypeOf(result.gatewayFee).toEqualTypeOf<bigint | null>()
expectTypeOf(result.gatewayFeeRecipient).toEqualTypeOf<`0x${string}` | null>()
Expand Down
17 changes: 9 additions & 8 deletions packages/core/src/actions/getTransaction.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { Chain } from 'viem'
import {
type GetTransactionParameters as viem_GetTransactionParameters,
type GetTransactionReturnType as viem_GetTransactionReturnType,
Expand All @@ -7,7 +8,6 @@ import {
import { type Config } from '../config.js'
import { type Evaluate } from '../internal.js'
import type { ChainId } from '../types/properties.js'
import type { Chain } from 'viem'

export type GetTransactionParameters<
config extends Config = Config,
Expand All @@ -21,13 +21,14 @@ export type GetTransactionReturnType<
chainId extends
| config['chains'][number]['id']
| undefined = config['chains'][number]['id'],
> = viem_GetTransactionReturnType<
Extract<
config['chains'][number],
{ id: chainId }
> extends infer chain extends Chain
? chain
: config['chains'][number]
///
chains extends readonly Chain[] = chainId extends config['chains'][number]['id']
? [Extract<config['chains'][number], { id: chainId }>]
: config['chains'],
> = Evaluate<
{
[key in keyof chains]: viem_GetTransactionReturnType<chains[key]>
}[number]
>

export type GetTransactionError = Error
Expand Down
77 changes: 77 additions & 0 deletions packages/core/src/actions/prepareSendTransaction.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { http } from 'viem'
import { celo, mainnet } from 'viem/chains'
import { expectTypeOf, test } from 'vitest'

import { createConfig } from '../config.js'
import {
type PrepareSendTransactionParameters,
prepareSendTransaction,
} from './prepareSendTransaction.js'

test('chain formatters', async () => {
const config = createConfig({
chains: [mainnet, celo],
transports: { [celo.id]: http(), [mainnet.id]: http() },
})

type Result = PrepareSendTransactionParameters<typeof config>
expectTypeOf<Result>().toMatchTypeOf<
{ chainId?: typeof celo.id | typeof mainnet.id | undefined } & {
feeCurrency?: `0x${string}` | undefined
gatewayFee?: bigint | undefined
gatewayFeeRecipient?: `0x${string}` | undefined
}
>()
const result = await prepareSendTransaction(config, {
feeCurrency: '0x',
gatewayFee: 100n,
gatewayFeeRecipient: '0x',
})
expectTypeOf(result.chainId).toMatchTypeOf<
typeof celo.id | typeof mainnet.id | undefined
>()
if ('feeCurrency' in result) {
expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()
expectTypeOf(result.gatewayFee).toEqualTypeOf<bigint | undefined>()
expectTypeOf(result.gatewayFeeRecipient).toEqualTypeOf<
`0x${string}` | undefined
>()
}

type Result2 = PrepareSendTransactionParameters<typeof config, typeof celo.id>
expectTypeOf<Result2>().toMatchTypeOf<{
feeCurrency?: `0x${string}` | undefined
gatewayFee?: bigint | undefined
gatewayFeeRecipient?: `0x${string}` | undefined
}>()
const result2 = await prepareSendTransaction(config, {
chainId: celo.id,
feeCurrency: '0x',
gatewayFee: 100n,
gatewayFeeRecipient: '0x',
})
expectTypeOf(result2.chainId).toMatchTypeOf(celo.id)
expectTypeOf(result2.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()
expectTypeOf(result2.gatewayFee).toEqualTypeOf<bigint | undefined>()
expectTypeOf(result2.gatewayFeeRecipient).toEqualTypeOf<
`0x${string}` | undefined
>()

type Result3 = PrepareSendTransactionParameters<
typeof config,
typeof mainnet.id
>
expectTypeOf<Result3>().not.toMatchTypeOf<{
feeCurrency?: `0x${string}` | undefined
gatewayFee?: bigint | undefined
gatewayFeeRecipient?: `0x${string}` | undefined
}>()
const result3 = await prepareSendTransaction(config, {
chainId: mainnet.id,
// @ts-expect-error
feeCurrency: '0x',
gatewayFee: 100n,
gatewayFeeRecipient: '0x',
})
expectTypeOf(result3.chainId).toMatchTypeOf(mainnet.id)
})
66 changes: 34 additions & 32 deletions packages/core/src/actions/prepareSendTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { estimateGas } from 'viem/actions'
import type { Config } from '../config.js'
import { ConnectorNotFoundError } from '../errors/config.js'
import type { ChainId } from '../types/properties.js'
import type { Evaluate, Omit } from '../types/utils.js'
import type { Evaluate, Omit, PartialBy } from '../types/utils.js'
import { assertActiveChain } from '../utils/assertActiveChain.js'
import { getConnectorClient } from './getConnectorClient.js'

Expand All @@ -13,43 +13,40 @@ export type PrepareSendTransactionParameters<
chainId extends
| config['chains'][number]['id']
| undefined = config['chains'][number]['id'],
///
chains extends readonly Chain[] = chainId extends config['chains'][number]['id']
? [Extract<config['chains'][number], { id: chainId }>]
: config['chains'],
> = Evaluate<
Omit<
SendTransactionParameters<
Extract<
config['chains'][number],
{ id: chainId }
> extends infer chain extends Chain
? chain
: config['chains'][number],
Account
>,
'account' | 'chain'
> &
ChainId<config, chainId>
>
{
[key in keyof chains]: Omit<
SendTransactionParameters<chains[key], Account>,
'account' | 'chain'
>
}[number]
> &
Evaluate<ChainId<config, chainId>>

export type PrepareSendTransactionReturnType<
config extends Config = Config,
chainId extends
| config['chains'][number]['id']
| undefined = config['chains'][number]['id'],
///
chains extends readonly Chain[] = chainId extends config['chains'][number]['id']
? [Extract<config['chains'][number], { id: chainId }>]
: config['chains'],
> = Evaluate<
Omit<
SendTransactionParameters<
Extract<
config['chains'][number],
{ id: chainId }
> extends infer chain extends Chain
? chain
: config['chains'][number],
Account
>,
'account' | 'chain'
> &
ChainId<config, chainId> & {
mode: 'prepared'
}
{
[key in keyof chains]: Omit<
SendTransactionParameters<chains[key], Account>,
'account' | 'chain'
> &
PartialBy<
{ chainId: chainId; mode: 'prepared' },
chainId extends config['chains'][number]['id'] ? never : 'chainId'
>
}[number]
>

export type PrepareSendTransactionError = Error
Expand All @@ -61,7 +58,12 @@ export async function prepareSendTransaction<
>(
config: config,
parameters: PrepareSendTransactionParameters<config, chainId>,
): Promise<PrepareSendTransactionReturnType<config, chainId>> {
): Promise<PrepareSendTransactionReturnType<config, chainId>>

export async function prepareSendTransaction(
config: Config,
parameters: PrepareSendTransactionParameters,
): Promise<PrepareSendTransactionReturnType> {
const { chainId, ...rest } = parameters

const connectorClient = await getConnectorClient(config)
Expand All @@ -81,5 +83,5 @@ export async function prepareSendTransaction<
gas,
mode: 'prepared',
chainId,
} as PrepareSendTransactionReturnType<config, chainId>
} as PrepareSendTransactionReturnType
}
Loading

0 comments on commit ca8153c

Please sign in to comment.