viem 3.0.0-next.0 → 3.0.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/core/Client.d.ts +235 -1
  2. package/dist/core/Client.d.ts.map +1 -1
  3. package/dist/core/Client.js +141 -0
  4. package/dist/core/Client.js.map +1 -1
  5. package/dist/core/actions/decorators/public.d.ts +52 -48
  6. package/dist/core/actions/decorators/public.d.ts.map +1 -1
  7. package/dist/core/actions/decorators/public.js +8 -4
  8. package/dist/core/actions/decorators/public.js.map +1 -1
  9. package/dist/core/actions/decorators/wallet.d.ts +25 -23
  10. package/dist/core/actions/decorators/wallet.d.ts.map +1 -1
  11. package/dist/core/actions/decorators/wallet.js +4 -2
  12. package/dist/core/actions/decorators/wallet.js.map +1 -1
  13. package/dist/core/actions/index.d.ts +2 -3
  14. package/dist/core/actions/index.d.ts.map +1 -1
  15. package/dist/core/actions/index.js +2 -3
  16. package/dist/core/actions/index.js.map +1 -1
  17. package/dist/core/actions/siwe/index.d.ts +2 -0
  18. package/dist/core/actions/siwe/index.d.ts.map +1 -0
  19. package/dist/core/actions/siwe/index.js +2 -0
  20. package/dist/core/actions/siwe/index.js.map +1 -0
  21. package/dist/core/actions/{verifySiweMessage.d.ts → siwe/verify.d.ts} +6 -6
  22. package/dist/core/actions/siwe/verify.d.ts.map +1 -0
  23. package/dist/core/actions/{verifySiweMessage.js → siwe/verify.js} +4 -4
  24. package/dist/core/actions/siwe/verify.js.map +1 -0
  25. package/dist/core/actions/typedData/index.d.ts +3 -0
  26. package/dist/core/actions/typedData/index.d.ts.map +1 -0
  27. package/dist/core/actions/typedData/index.js +3 -0
  28. package/dist/core/actions/typedData/index.js.map +1 -0
  29. package/dist/core/actions/{signTypedData.d.ts → typedData/sign.d.ts} +6 -6
  30. package/dist/core/actions/typedData/sign.d.ts.map +1 -0
  31. package/dist/core/actions/{signTypedData.js → typedData/sign.js} +4 -4
  32. package/dist/core/actions/typedData/sign.js.map +1 -0
  33. package/dist/core/actions/{verifyTypedData.d.ts → typedData/verify.d.ts} +6 -6
  34. package/dist/core/actions/typedData/verify.d.ts.map +1 -0
  35. package/dist/core/actions/{verifyTypedData.js → typedData/verify.js} +4 -4
  36. package/dist/core/actions/typedData/verify.js.map +1 -0
  37. package/dist/erc4337/internal/erc7739.js +1 -1
  38. package/dist/erc4337/internal/erc7739.js.map +1 -1
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/package.json +1 -1
  42. package/src/core/Client.ts +444 -1
  43. package/src/core/actions/decorators/public.ts +64 -57
  44. package/src/core/actions/decorators/wallet.ts +34 -29
  45. package/src/core/actions/index.ts +2 -3
  46. package/src/core/actions/siwe/index.ts +1 -0
  47. package/src/core/actions/{verifySiweMessage.ts → siwe/verify.ts} +7 -7
  48. package/src/core/actions/typedData/index.ts +2 -0
  49. package/src/core/actions/{signTypedData.ts → typedData/sign.ts} +8 -8
  50. package/src/core/actions/{verifyTypedData.ts → typedData/verify.ts} +8 -8
  51. package/src/erc4337/internal/erc7739.ts +1 -1
  52. package/src/version.ts +1 -1
  53. package/dist/core/actions/signTypedData.d.ts.map +0 -1
  54. package/dist/core/actions/signTypedData.js.map +0 -1
  55. package/dist/core/actions/verifySiweMessage.d.ts.map +0 -1
  56. package/dist/core/actions/verifySiweMessage.js.map +0 -1
  57. package/dist/core/actions/verifyTypedData.d.ts.map +0 -1
  58. package/dist/core/actions/verifyTypedData.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { TypedData } from 'ox';
2
- import { verifyHash } from './verifyHash.js';
2
+ import { verifyHash } from '../verifyHash.js';
3
3
  /**
4
4
  * Verifies that typed data was signed by the provided address, supporting
5
5
  * Smart Contract Accounts (ERC-1271/6492/8010) and Externally Owned Accounts.
@@ -13,7 +13,7 @@ import { verifyHash } from './verifyHash.js';
13
13
  * chain: mainnet,
14
14
  * transport: http(),
15
15
  * })
16
- * const valid = await Actions.verifyTypedData(client, {
16
+ * const valid = await Actions.typedData.verify(client, {
17
17
  * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
18
18
  * domain: { name: 'Ether Mail', version: '1', chainId: 1 },
19
19
  * types: {
@@ -25,7 +25,7 @@ import { verifyHash } from './verifyHash.js';
25
25
  * })
26
26
  * ```
27
27
  */
28
- export async function verifyTypedData(client, options) {
28
+ export async function verify(client, options) {
29
29
  const { address, blockHash, blockNumber, blockTag, erc6492VerifierAddress, factory, factoryData, mode, multicallAddress, requestOptions, requireCanonical, signature, ...typedData } = options;
30
30
  return verifyHash(client, {
31
31
  address,
@@ -43,4 +43,4 @@ export async function verifyTypedData(client, options) {
43
43
  signature,
44
44
  });
45
45
  }
46
- //# sourceMappingURL=verifyTypedData.js.map
46
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../src/core/actions/typedData/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAI9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAI1B,MAAqB,EACrB,OAA+C;IAE/C,MAAM,EACJ,OAAO,EACP,SAAS,EACT,WAAW,EACX,QAAQ,EACR,sBAAsB,EACtB,OAAO,EACP,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,GAAG,SAAS,EACb,GAAG,OAAyB,CAAA;IAE7B,OAAO,UAAU,CAAC,MAAM,EAAE;QACxB,OAAO;QACP,SAAS;QACT,WAAW;QACX,QAAQ;QACR,sBAAsB;QACtB,OAAO;QACP,WAAW;QACX,IAAI,EAAE,SAAS,CAAC,cAAc,CAAC,SAAmC,CAAC;QACnE,IAAI;QACJ,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,SAAS;KACY,CAAC,CAAA;AAC1B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { AbiParameters, Hex, PersonalMessage, TypedData } from 'ox';
2
2
  import { getEip712Domain } from '../../core/actions/contract/getEip712Domain.js';
3
- import { signTypedData as signTypedData_ } from '../../core/actions/signTypedData.js';
3
+ import { sign as signTypedData_ } from '../../core/actions/typedData/sign.js';
4
4
  /** Signs a personal message with ERC-7739 nested EIP-712. */
5
5
  export async function signMessage(client, options) {
6
6
  const { account, factory, factoryData, message, verifier } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"erc7739.js","sourceRoot":"","sources":["../../../src/erc4337/internal/erc7739.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"erc7739.js","sourceRoot":"","sources":["../../../src/erc4337/internal/erc7739.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  /** @internal */
2
- export declare const version = "3.0.0-next.0";
2
+ export declare const version = "3.0.0-next.2";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** @internal */
2
- export const version = '3.0.0-next.0';
2
+ export const version = '3.0.0-next.2';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "3.0.0-next.0",
4
+ "version": "3.0.0-next.2",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -1,4 +1,9 @@
1
- import type { Address, Errors as ox_Errors, RpcSchema } from 'ox'
1
+ import {
2
+ type Address,
3
+ type Errors as ox_Errors,
4
+ Provider,
5
+ type RpcSchema,
6
+ } from 'ox'
2
7
 
3
8
  import type * as CcipRead from '../utils/CcipRead.js'
4
9
  import * as Account from './Account.js'
@@ -464,6 +469,444 @@ export declare namespace createResolver {
464
469
  | create.ErrorType
465
470
  }
466
471
 
472
+ /**
473
+ * Creates a v3 {@link Client} from a v2-compatible base Client. The returned
474
+ * Client forwards requests through the v2 Client and can be extended with v3
475
+ * action decorators.
476
+ *
477
+ * The adapted Client derives its Chain from the source chain ID and carries
478
+ * only JSON-RPC Accounts by default. Pass v3-native values to preserve full
479
+ * Chain or Account behavior.
480
+ * The returned Client owns retries: forwarded requests disable the v2 Client's
481
+ * retry layer. Forwarded errors are normalized with `Provider.parseError`.
482
+ *
483
+ * @example
484
+ * ```ts
485
+ * import { createClient as createClientV2, http as httpV2 } from 'viem'
486
+ * import { Client, publicActions } from 'viem-v3'
487
+ *
488
+ * const clientV2 = createClientV2({ transport: httpV2() })
489
+ * const publicClient = Client.fromV2(clientV2).extend(publicActions())
490
+ * ```
491
+ *
492
+ * @param client - The v2-compatible base Client.
493
+ * @param options - Optional v3 Chain and Account overrides.
494
+ * @returns A v3 Client.
495
+ */
496
+ export function fromV2<
497
+ const source extends V2SourceClient,
498
+ chainOrId extends Chain.Chain | number | undefined = never,
499
+ accountOrAddress extends Account.Account | Address.Address | undefined =
500
+ never,
501
+ >(
502
+ client: source,
503
+ options: fromV2.Options<chainOrId, accountOrAddress> = {},
504
+ ): fromV2.ReturnType<
505
+ V2ResolveChain<source['chain'], chainOrId>,
506
+ V2ResolveAccount<source['account'], accountOrAddress>
507
+ > {
508
+ const chain = (
509
+ 'chain' in options ? options.chain : client.chain?.id
510
+ ) as V2ResolveChain<source['chain'], chainOrId>
511
+ const account = (
512
+ 'account' in options
513
+ ? options.account
514
+ : client.account?.type === 'json-rpc'
515
+ ? client.account
516
+ : undefined
517
+ ) as V2ResolveAccount<source['account'], accountOrAddress>
518
+ const request = client.request as unknown as V2Request
519
+
520
+ const transport = Transport.from({
521
+ key: 'v2',
522
+ name: 'Viem v2 Client',
523
+ type: 'custom',
524
+ setup() {
525
+ return {
526
+ async request(parameters, options) {
527
+ try {
528
+ return await request(parameters, { ...options, retryCount: 0 })
529
+ } catch (error) {
530
+ throw Provider.parseError(error)
531
+ }
532
+ },
533
+ }
534
+ },
535
+ })
536
+
537
+ // The runtime branches above mirror the conditional target types.
538
+ return create({
539
+ account,
540
+ batch: client.batch,
541
+ blockTag: client.experimental_blockTag,
542
+ cacheTime: client.cacheTime,
543
+ ccipRead: client.ccipRead === false ? false : undefined,
544
+ chain,
545
+ dataSuffix: client.dataSuffix,
546
+ key: client.key,
547
+ name: client.name,
548
+ pollingInterval: client.pollingInterval,
549
+ transport,
550
+ type: client.type,
551
+ }) as unknown as Client<
552
+ V2ResolveChain<source['chain'], chainOrId>,
553
+ V2ResolveAccount<source['account'], accountOrAddress>,
554
+ Transport.Transport<'custom'>
555
+ >
556
+ }
557
+
558
+ export declare namespace fromV2 {
559
+ /** Options for {@link fromV2}. */
560
+ type Options<
561
+ chainOrId extends Chain.Chain | number | undefined = never,
562
+ accountOrAddress extends Account.Account | Address.Address | undefined =
563
+ never,
564
+ > = {
565
+ /** v3 Account or address to use instead of the v2 Client's Account. */
566
+ account?: accountOrAddress | undefined
567
+ /** v3 Chain or chain ID to use instead of the v2 Client's chain ID. */
568
+ chain?: chainOrId | undefined
569
+ }
570
+
571
+ /** Return type of {@link fromV2}. */
572
+ type ReturnType<
573
+ chain extends Chain.Chain | undefined = Chain.Chain | undefined,
574
+ account extends Account.Account | undefined = Account.Account | undefined,
575
+ > = Client<chain, account, Transport.Transport<'custom'>>
576
+
577
+ /** Errors thrown while adapting a v2 Client. */
578
+ type ErrorType = create.ErrorType | ox_Errors.GlobalErrorType
579
+ }
580
+
581
+ /**
582
+ * Creates a v2-compatible base Client from a v3 {@link Client}. Extend the
583
+ * result with v2 action decorators to create a v2 Public, Wallet, or custom
584
+ * Client.
585
+ *
586
+ * The one-argument form creates a chainless Client and only preserves
587
+ * JSON-RPC Accounts. Pass v2-native values to preserve full Chain or local
588
+ * Account behavior. Requests preserve the v3 Client's error identities.
589
+ *
590
+ * @example
591
+ * ```ts
592
+ * import { publicActions as publicActionsV2 } from 'viem'
593
+ * import { Client, http } from 'viem-v3'
594
+ *
595
+ * const client = Client.create({ transport: http() })
596
+ * const publicClientV2 = Client.toV2(client).extend(publicActionsV2)
597
+ * ```
598
+ *
599
+ * @param client - The v3 Client.
600
+ * @param options - Optional v2 Chain and Account overrides.
601
+ * @returns A v2-compatible base Client.
602
+ */
603
+ export function toV2<
604
+ const source extends Client,
605
+ chain extends V2Chain | undefined = never,
606
+ account extends V2Account | undefined = never,
607
+ >(
608
+ client: source,
609
+ options: toV2.Options<chain, account> = {},
610
+ ): toV2.ReturnType<
611
+ V2ResolveTargetChain<chain>,
612
+ V2ResolveTargetAccount<source['account'], account>
613
+ > {
614
+ const request = client.request as unknown as V2Request
615
+ const account = (
616
+ 'account' in options
617
+ ? options.account
618
+ : client.account?.type === 'json-rpc'
619
+ ? client.account
620
+ : undefined
621
+ ) as V2ResolveTargetAccount<source['account'], account>
622
+
623
+ const base: V2Base<
624
+ V2ResolveTargetChain<chain>,
625
+ V2ResolveTargetAccount<source['account'], account>
626
+ > = {
627
+ account,
628
+ batch: client.batch,
629
+ cacheTime: client.cacheTime,
630
+ ccipRead: client.ccipRead === false ? false : undefined,
631
+ chain: options.chain as V2ResolveTargetChain<chain>,
632
+ dataSuffix: client.dataSuffix,
633
+ experimental_blockTag: client.blockTag,
634
+ key: client.key,
635
+ name: client.name,
636
+ pollingInterval: client.pollingInterval,
637
+ request,
638
+ tokens: undefined,
639
+ transport: {
640
+ key: 'custom',
641
+ name: 'Viem v3 Client',
642
+ request,
643
+ retryCount: 0,
644
+ type: 'custom',
645
+ },
646
+ type: client.type,
647
+ uid: uid(),
648
+ }
649
+
650
+ return withV2Extend(base)
651
+ }
652
+
653
+ export declare namespace toV2 {
654
+ /** Options for {@link toV2}. */
655
+ type Options<
656
+ chain extends V2Chain | undefined = never,
657
+ account extends V2Account | undefined = never,
658
+ > = {
659
+ /** v2 JSON-RPC or local Account to use instead of the v3 Client's Account. */
660
+ account?: account | undefined
661
+ /** v2 Chain to attach to the adapted Client. */
662
+ chain?: chain | undefined
663
+ }
664
+
665
+ /** Return type of {@link toV2}. */
666
+ type ReturnType<
667
+ chain extends V2Chain | undefined = undefined,
668
+ account extends V2Account | undefined = undefined,
669
+ > = V2Client<chain, account, undefined>
670
+ }
671
+
672
+ type V2Base<
673
+ chain extends V2Chain | undefined,
674
+ account extends V2Account | undefined,
675
+ > = {
676
+ /** The Account of the Client. */
677
+ account: account
678
+ /** `eth_call` multicall aggregation flags. */
679
+ batch?: { multicall?: boolean | MulticallOptions | undefined } | undefined
680
+ /** Time (in ms) cached data stays in memory. */
681
+ cacheTime: number
682
+ /** Whether CCIP Read is disabled. */
683
+ ccipRead?: false | undefined
684
+ /** Chain for the Client. */
685
+ chain: chain
686
+ /** Data suffix appended to transaction calldata. */
687
+ dataSuffix?: DataSuffix | undefined
688
+ /** Default block tag for RPC requests. */
689
+ experimental_blockTag?: BlockTag | undefined
690
+ /** A key for the Client. */
691
+ key: string
692
+ /** A name for the Client. */
693
+ name: string
694
+ /** Polling frequency (ms) for actions and events. */
695
+ pollingInterval: number
696
+ /** Request function forwarded to the v3 Client. */
697
+ request: V2Request
698
+ /** Token functions are not adapted between versions. */
699
+ tokens: undefined
700
+ /** Synthetic custom transport backed by the v3 Client. */
701
+ transport: V2Transport
702
+ /** The type of Client. */
703
+ type: string
704
+ /** A unique id for the Client. */
705
+ uid: string
706
+ }
707
+
708
+ type V2Extended = Prettify<
709
+ { [key in keyof V2Base<any, any>]?: undefined } & {
710
+ [key: string]: unknown
711
+ }
712
+ >
713
+
714
+ type V2Client<
715
+ chain extends V2Chain | undefined,
716
+ account extends V2Account | undefined,
717
+ extended extends V2Extended | undefined,
718
+ > = V2Base<chain, account> &
719
+ (extended extends V2Extended ? extended : unknown) & {
720
+ /**
721
+ * Extends the Client with a v2 decorator. The installed v2 Client type
722
+ * supplies target-version protected-action constraints.
723
+ */
724
+ extend: <const extension extends V2Extended>(
725
+ fn: (client: V2Client<chain, account, extended>) => extension,
726
+ ) => V2Client<
727
+ chain,
728
+ account,
729
+ Prettify<extension> & (extended extends V2Extended ? extended : unknown)
730
+ >
731
+ }
732
+
733
+ function withV2Extend<
734
+ chain extends V2Chain | undefined,
735
+ account extends V2Account | undefined,
736
+ >(client: V2Base<chain, account>): V2Client<chain, account, undefined> {
737
+ function extend(base: Record<string, unknown>) {
738
+ return (
739
+ fn: (client: Record<string, unknown>) => Record<string, unknown>,
740
+ ) => {
741
+ const extended = fn(base)
742
+ for (const key in client) delete extended[key]
743
+ const combined = { ...base, ...extended }
744
+ for (const key in extended) {
745
+ const a = base[key]
746
+ const b = extended[key]
747
+ if (isPlainObject(a) && isPlainObject(b)) combined[key] = { ...a, ...b }
748
+ }
749
+ return Object.assign(combined, { extend: extend(combined) })
750
+ }
751
+ }
752
+
753
+ const base = client as unknown as Record<string, unknown>
754
+ return Object.assign(base, {
755
+ extend: extend(base),
756
+ }) as V2Client<chain, account, undefined>
757
+ }
758
+
759
+ type V2Account = V2JsonRpcAccount | V2LocalAccount
760
+
761
+ type V2JsonRpcAccount = {
762
+ address: Address.Address
763
+ type: 'json-rpc'
764
+ }
765
+
766
+ type V2LocalAccount = {
767
+ address: Address.Address
768
+ nonceManager?: object | undefined
769
+ publicKey: `0x${string}`
770
+ sign?: V2SignFn | undefined
771
+ signAuthorization?: V2SignFn | undefined
772
+ signMessage: V2SignFn
773
+ signTransaction: V2SignFn
774
+ signTypedData: V2SignFn
775
+ source: string
776
+ type: 'local'
777
+ }
778
+
779
+ type V2Chain = {
780
+ id: number
781
+ name: string
782
+ nativeCurrency: {
783
+ decimals: number
784
+ name: string
785
+ symbol: string
786
+ }
787
+ rpcUrls: {
788
+ [key: string]: V2RpcUrls
789
+ default: V2RpcUrls
790
+ }
791
+ }
792
+
793
+ type V2RpcUrls = {
794
+ http: readonly string[]
795
+ webSocket?: readonly string[] | undefined
796
+ }
797
+
798
+ type V2RequestOptions = {
799
+ dedupe?: boolean | undefined
800
+ methods?:
801
+ | { include?: string[] | undefined }
802
+ | { exclude?: string[] | undefined }
803
+ | undefined
804
+ retryDelay?: number | undefined
805
+ retryCount?: number | undefined
806
+ signal?: AbortSignal | undefined
807
+ uid?: string | undefined
808
+ }
809
+
810
+ type V2Request = <
811
+ schemaOverride extends V2RequestOverride | undefined = undefined,
812
+ parameters extends V2RequestParameters = V2RequestParameters,
813
+ returnType = schemaOverride extends { ReturnType: infer returnType }
814
+ ? returnType
815
+ : unknown,
816
+ >(
817
+ parameters: parameters,
818
+ options?: V2RequestOptions | undefined,
819
+ ) => Promise<returnType>
820
+
821
+ type V2RequestOverride = {
822
+ Parameters?: unknown | undefined
823
+ ReturnType: unknown
824
+ }
825
+
826
+ type V2RequestParameters = {
827
+ method: string
828
+ params?: unknown | undefined
829
+ }
830
+
831
+ type V2SourceClient<
832
+ chain extends { id: number } | undefined = { id: number } | undefined,
833
+ account extends V2SourceAccount | undefined = V2SourceAccount | undefined,
834
+ > = {
835
+ account: account
836
+ batch?: { multicall?: boolean | MulticallOptions | undefined } | undefined
837
+ cacheTime: number
838
+ ccipRead?: object | false | undefined
839
+ chain: chain
840
+ dataSuffix?: DataSuffix | undefined
841
+ experimental_blockTag?: BlockTag | undefined
842
+ key: string
843
+ name: string
844
+ pollingInterval: number
845
+ request: (...args: never[]) => Promise<unknown>
846
+ type: string
847
+ }
848
+
849
+ type V2SourceAccount = {
850
+ address: Address.Address
851
+ type: string
852
+ }
853
+
854
+ type V2SignFn = (...args: never[]) => Promise<unknown>
855
+
856
+ type V2Transport = {
857
+ key: string
858
+ methods?:
859
+ | { include?: string[] | undefined }
860
+ | { exclude?: string[] | undefined }
861
+ | undefined
862
+ name: string
863
+ request: V2Request
864
+ retryCount?: number | undefined
865
+ retryDelay?: number | undefined
866
+ timeout?: number | undefined
867
+ type: 'custom'
868
+ }
869
+
870
+ type V2ResolveAccount<
871
+ account extends V2SourceAccount | undefined,
872
+ accountOrAddress extends Account.Account | Address.Address | undefined,
873
+ > = [accountOrAddress] extends [never]
874
+ ? account extends {
875
+ address: infer address extends Address.Address
876
+ type: 'json-rpc'
877
+ }
878
+ ? Account.JsonRpc<address>
879
+ : undefined
880
+ : accountOrAddress extends Address.Address
881
+ ? Account.JsonRpc<accountOrAddress>
882
+ : accountOrAddress
883
+
884
+ type V2ResolveChain<
885
+ chain extends { id: number } | undefined,
886
+ chainOrId extends Chain.Chain | number | undefined,
887
+ > = [chainOrId] extends [never]
888
+ ? chain extends { id: infer id extends number }
889
+ ? Chain.Chain & { id: id }
890
+ : undefined
891
+ : chainOrId extends number
892
+ ? Chain.Chain & { id: chainOrId }
893
+ : chainOrId
894
+
895
+ type V2ResolveTargetAccount<
896
+ account extends Account.Account | undefined,
897
+ accountOverride extends V2Account | undefined,
898
+ > = [accountOverride] extends [never]
899
+ ? account extends Account.JsonRpc<infer address>
900
+ ? { address: address; type: 'json-rpc' }
901
+ : undefined
902
+ : accountOverride
903
+
904
+ type V2ResolveTargetChain<chain extends V2Chain | undefined> = [chain] extends [
905
+ never,
906
+ ]
907
+ ? undefined
908
+ : chain
909
+
467
910
  type ResolvedChain<
468
911
  chains extends ResolverChains,
469
912
  chainId extends chains[number]['id'],