From d075f82f30f4969a353e4ea29ca2a25a04810523 Mon Sep 17 00:00:00 2001 From: Kevin Ingersoll Date: Tue, 3 Oct 2023 18:04:22 +0100 Subject: [PATCH] refactor(common): move `createContract`'s internal write logic to `writeContract` (#1693) --- .changeset/rotten-beers-learn.md | 15 ++ .../client-vanilla/src/mud/setupNetwork.ts | 4 +- e2e/packages/test-data/generate-test-data.ts | 4 +- .../client-phaser/src/mud/setupNetwork.ts | 4 +- .../client-react/src/mud/setupNetwork.ts | 4 +- .../client-vanilla/src/mud/setupNetwork.ts | 4 +- packages/common/src/createContract.ts | 175 +----------------- packages/common/src/createNonceManager.ts | 49 +++-- packages/common/src/getContract.ts | 101 ++++++++++ packages/common/src/getNonceManager.ts | 21 +++ packages/common/src/getNonceManagerId.ts | 15 ++ packages/common/src/index.ts | 8 +- packages/common/src/writeContract.ts | 120 ++++++++++++ .../client/src/mud/createSystemCalls.ts | 2 +- .../packages/client/src/mud/setupNetwork.ts | 4 +- .../client/src/mud/createSystemCalls.ts | 2 +- .../packages/client/src/mud/setupNetwork.ts | 4 +- .../client/src/mud/createSystemCalls.ts | 2 +- .../packages/client/src/mud/setupNetwork.ts | 4 +- .../client/src/mud/createSystemCalls.ts | 2 +- .../packages/client/src/mud/setupNetwork.ts | 4 +- 21 files changed, 328 insertions(+), 220 deletions(-) create mode 100644 .changeset/rotten-beers-learn.md create mode 100644 packages/common/src/getContract.ts create mode 100644 packages/common/src/getNonceManager.ts create mode 100644 packages/common/src/getNonceManagerId.ts create mode 100644 packages/common/src/writeContract.ts diff --git a/.changeset/rotten-beers-learn.md b/.changeset/rotten-beers-learn.md new file mode 100644 index 0000000000..b566ca4250 --- /dev/null +++ b/.changeset/rotten-beers-learn.md @@ -0,0 +1,15 @@ +--- +"@latticexyz/common": minor +--- + +- Moves contract write logic out of `createContract` into its own `writeContract` method so that it can be used outside of the contract instance, and for consistency with viem. +- Deprecates `createContract` in favor of `getContract` for consistency with viem. +- Reworks `createNonceManager`'s `BroadcastChannel` setup and moves out the notion of a "nonce manager ID" to `getNonceManagerId` so we can create an internal cache with `getNonceManager` for use in `writeContract`. + +If you were using the `createNonceManager` before, you'll just need to rename `publicClient` argument to `client`: + +```diff + const publicClient = createPublicClient({ ... }); +- const nonceManager = createNonceManager({ publicClient, ... }); ++ const nonceManager = createNonceManager({ client: publicClient, ... }); +``` diff --git a/e2e/packages/client-vanilla/src/mud/setupNetwork.ts b/e2e/packages/client-vanilla/src/mud/setupNetwork.ts index 34cb6e7329..17c1586374 100644 --- a/e2e/packages/client-vanilla/src/mud/setupNetwork.ts +++ b/e2e/packages/client-vanilla/src/mud/setupNetwork.ts @@ -4,7 +4,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver } from "@latticexyz/common"; import mudConfig from "contracts/mud.config"; export type SetupNetworkResult = Awaited>; @@ -26,7 +26,7 @@ export async function setupNetwork() { account: burnerAccount, }); - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/e2e/packages/test-data/generate-test-data.ts b/e2e/packages/test-data/generate-test-data.ts index 4b146a12c3..87a9e659e2 100644 --- a/e2e/packages/test-data/generate-test-data.ts +++ b/e2e/packages/test-data/generate-test-data.ts @@ -13,7 +13,7 @@ import { numberToHex, } from "viem"; import { mudFoundry } from "@latticexyz/common/chains"; -import { createContract } from "@latticexyz/common"; +import { getContract } from "@latticexyz/common"; import { storeEventsAbi } from "@latticexyz/store"; import { privateKeyToAccount } from "viem/accounts"; import IWorldAbi from "../contracts/out/IWorld.sol/IWorld.abi.json"; @@ -63,7 +63,7 @@ const walletClient = createWalletClient({ account, }); -const worldContract = createContract({ +const worldContract = getContract({ address: worldAddress, abi: IWorldAbi, publicClient, diff --git a/examples/minimal/packages/client-phaser/src/mud/setupNetwork.ts b/examples/minimal/packages/client-phaser/src/mud/setupNetwork.ts index 144ecd4a33..6c8e716ef3 100644 --- a/examples/minimal/packages/client-phaser/src/mud/setupNetwork.ts +++ b/examples/minimal/packages/client-phaser/src/mud/setupNetwork.ts @@ -4,7 +4,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; import mudConfig from "contracts/mud.config"; @@ -28,7 +28,7 @@ export async function setupNetwork() { }); const write$ = new Subject(); - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/examples/minimal/packages/client-react/src/mud/setupNetwork.ts b/examples/minimal/packages/client-react/src/mud/setupNetwork.ts index 895bf70553..1353c0803c 100644 --- a/examples/minimal/packages/client-react/src/mud/setupNetwork.ts +++ b/examples/minimal/packages/client-react/src/mud/setupNetwork.ts @@ -4,7 +4,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { ContractWrite, createBurnerAccount, createContract, transportObserver } from "@latticexyz/common"; +import { ContractWrite, createBurnerAccount, getContract, transportObserver } from "@latticexyz/common"; import { Subject, share } from "rxjs"; import mudConfig from "contracts/mud.config"; import { createClient as createFaucetClient } from "@latticexyz/faucet"; @@ -29,7 +29,7 @@ export async function setupNetwork() { }); const write$ = new Subject(); - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/examples/minimal/packages/client-vanilla/src/mud/setupNetwork.ts b/examples/minimal/packages/client-vanilla/src/mud/setupNetwork.ts index 144ecd4a33..6c8e716ef3 100644 --- a/examples/minimal/packages/client-vanilla/src/mud/setupNetwork.ts +++ b/examples/minimal/packages/client-vanilla/src/mud/setupNetwork.ts @@ -4,7 +4,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; import mudConfig from "contracts/mud.config"; @@ -28,7 +28,7 @@ export async function setupNetwork() { }); const write$ = new Subject(); - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/packages/common/src/createContract.ts b/packages/common/src/createContract.ts index b88924fc19..04404ea27d 100644 --- a/packages/common/src/createContract.ts +++ b/packages/common/src/createContract.ts @@ -1,173 +1,4 @@ -import { - Abi, - Account, - Address, - Chain, - GetContractParameters, - GetContractReturnType, - Hex, - PublicClient, - SimulateContractParameters, - Transport, - WalletClient, - WriteContractParameters, - getContract, -} from "viem"; -import pRetry from "p-retry"; -import { createNonceManager } from "./createNonceManager"; -import { debug as parentDebug } from "./debug"; -import { UnionOmit } from "./type-utils/common"; +import { getContract } from "./getContract"; -const debug = parentDebug.extend("createContract"); - -// copied from viem because this isn't exported -// TODO: import from viem? -function getFunctionParameters(values: [args?: readonly unknown[], options?: object]): { - args: readonly unknown[]; - options: object; -} { - const hasArgs = values.length && Array.isArray(values[0]); - const args = hasArgs ? values[0]! : []; - const options = (hasArgs ? values[1] : values[0]) ?? {}; - return { args, options }; -} - -export type ContractWrite = { - id: string; - request: WriteContractParameters; - result: Promise; -}; - -export type CreateContractOptions< - TTransport extends Transport, - TAddress extends Address, - TAbi extends Abi, - TChain extends Chain, - TAccount extends Account, - TPublicClient extends PublicClient, - TWalletClient extends WalletClient -> = Required> & { - onWrite?: (write: ContractWrite) => void; -}; - -export function createContract< - TTransport extends Transport, - TAddress extends Address, - TAbi extends Abi, - TChain extends Chain, - TAccount extends Account, - TPublicClient extends PublicClient, - TWalletClient extends WalletClient ->({ - abi, - address, - publicClient, - walletClient, - onWrite, -}: CreateContractOptions< - TTransport, - TAddress, - TAbi, - TChain, - TAccount, - TPublicClient, - TWalletClient ->): GetContractReturnType { - const contract = getContract({ - abi, - address, - publicClient, - walletClient, - }) as unknown as GetContractReturnType; - - if (contract.write) { - let nextWriteId = 0; - const nonceManager = createNonceManager({ - publicClient: publicClient as PublicClient, - address: walletClient.account.address, - }); - - // Replace write calls with our own proxy. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries). - contract.write = new Proxy( - {}, - { - get(_, functionName: string): GetContractReturnType["write"][string] { - async function prepareWrite( - options: WriteContractParameters - ): Promise> { - if (options.gas) { - debug("gas provided, skipping simulate", functionName, options); - return options as unknown as WriteContractParameters; - } - - debug("simulating write", functionName, options); - const { request } = await publicClient.simulateContract({ - ...options, - account: options.account ?? walletClient.account, - } as unknown as SimulateContractParameters); - - return request as unknown as WriteContractParameters; - } - - async function write(options: WriteContractParameters): Promise { - const preparedWrite = await prepareWrite(options); - - return await pRetry( - async () => { - if (!nonceManager.hasNonce()) { - await nonceManager.resetNonce(); - } - - const nonce = nonceManager.nextNonce(); - debug("calling write function with nonce", nonce, preparedWrite); - return await walletClient.writeContract({ - nonce, - ...preparedWrite, - }); - }, - { - retries: 3, - onFailedAttempt: async (error) => { - // On nonce errors, reset the nonce and retry - if (nonceManager.shouldResetNonce(error)) { - debug("got nonce error, retrying", error); - await nonceManager.resetNonce(); - return; - } - // TODO: prepareWrite again if there are gas errors? - throw error; - }, - } - ); - } - - return (...parameters) => { - const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`; - const { args, options } = < - { - args: unknown[]; - options: UnionOmit; - } - >getFunctionParameters(parameters as any); - - const request = { - address, - abi, - functionName, - args, - ...options, - }; - - const result = write(request); - - onWrite?.({ id, request, result }); - - return result; - }; - }, - } - ); - } - - return contract as unknown as GetContractReturnType; -} +/** @deprecated use `getContract` instead */ +export const createContract = getContract; diff --git a/packages/common/src/createNonceManager.ts b/packages/common/src/createNonceManager.ts index f9d3b8222c..e134726143 100644 --- a/packages/common/src/createNonceManager.ts +++ b/packages/common/src/createNonceManager.ts @@ -1,23 +1,18 @@ -import { - BaseError, - BlockTag, - Hex, - NonceTooHighError, - NonceTooLowError, - PublicClient, - TransactionExecutionError, -} from "viem"; +import { BaseError, BlockTag, Client, Hex, NonceTooHighError, NonceTooLowError } from "viem"; import { debug as parentDebug } from "./debug"; +import { getNonceManagerId } from "./getNonceManagerId"; +import { getTransactionCount } from "viem/actions"; const debug = parentDebug.extend("createNonceManager"); -type CreateNonceManagerOptions = { - publicClient: PublicClient; +export type CreateNonceManagerOptions = { + client: Client; address: Hex; blockTag?: BlockTag; + broadcastChannelName?: string; }; -type CreateNonceManagerResult = { +export type CreateNonceManagerResult = { hasNonce: () => boolean; nextNonce: () => number; resetNonce: () => Promise; @@ -25,22 +20,26 @@ type CreateNonceManagerResult = { }; export function createNonceManager({ - publicClient, + client, address, - blockTag, + blockTag = "latest", + broadcastChannelName, }: CreateNonceManagerOptions): CreateNonceManagerResult { const nonceRef = { current: -1 }; - const channel = - typeof BroadcastChannel !== "undefined" - ? // TODO: fetch chain ID or require it via types? - new BroadcastChannel(`mud:createNonceManager:${publicClient.chain?.id}:${address}`) - : null; + let channel: BroadcastChannel | null = null; - if (channel) { - channel.addEventListener("message", (event) => { - const nonce = JSON.parse(event.data); - debug("got nonce from broadcast channel", nonce); - nonceRef.current = nonce; + if (typeof BroadcastChannel !== "undefined") { + const channelName = broadcastChannelName + ? Promise.resolve(broadcastChannelName) + : getNonceManagerId({ client, address, blockTag }); + channelName.then((name) => { + channel = new BroadcastChannel(name); + // TODO: emit some sort of "connected" event so other channels can broadcast current nonce + channel.addEventListener("message", (event) => { + const nonce = JSON.parse(event.data); + debug("got nonce from broadcast channel", nonce); + nonceRef.current = nonce; + }); }); } @@ -56,7 +55,7 @@ export function createNonceManager({ } async function resetNonce(): Promise { - const nonce = await publicClient.getTransactionCount({ address, blockTag }); + const nonce = await getTransactionCount(client, { address, blockTag }); nonceRef.current = nonce; channel?.postMessage(JSON.stringify(nonceRef.current)); debug("reset nonce to", nonceRef.current); diff --git a/packages/common/src/getContract.ts b/packages/common/src/getContract.ts new file mode 100644 index 0000000000..634da2a305 --- /dev/null +++ b/packages/common/src/getContract.ts @@ -0,0 +1,101 @@ +import { + Abi, + Account, + Address, + Chain, + GetContractParameters, + GetContractReturnType, + PublicClient, + Transport, + WalletClient, + WriteContractParameters, + getContract as viem_getContract, +} from "viem"; +import { UnionOmit } from "./type-utils/common"; +import { WriteContractOptions, writeContract } from "./writeContract"; + +// copied from viem because this isn't exported +// TODO: import from viem? +function getFunctionParameters(values: [args?: readonly unknown[], options?: object]): { + args: readonly unknown[]; + options: object; +} { + const hasArgs = values.length && Array.isArray(values[0]); + const args = hasArgs ? values[0]! : []; + const options = (hasArgs ? values[1] : values[0]) ?? {}; + return { args, options }; +} + +export type GetContractOptions< + TTransport extends Transport, + TAddress extends Address, + TAbi extends Abi, + TChain extends Chain, + TAccount extends Account, + TPublicClient extends PublicClient, + TWalletClient extends WalletClient +> = Required> & { + onWrite?: WriteContractOptions["onWrite"]; +}; + +// TODO: migrate away from this approach once we can hook into viem: https://github.com/wagmi-dev/viem/discussions/1230 + +export function getContract< + TTransport extends Transport, + TAddress extends Address, + TAbi extends Abi, + TChain extends Chain, + TAccount extends Account, + TPublicClient extends PublicClient, + TWalletClient extends WalletClient +>({ + abi, + address, + publicClient, + walletClient, + onWrite, +}: GetContractOptions< + TTransport, + TAddress, + TAbi, + TChain, + TAccount, + TPublicClient, + TWalletClient +>): GetContractReturnType { + const contract = viem_getContract({ + abi, + address, + publicClient, + walletClient, + }) as unknown as GetContractReturnType; + + if (contract.write) { + // Replace write calls with our own. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries). + contract.write = new Proxy( + {}, + { + get(_, functionName: string) { + return ( + ...parameters: [ + args?: readonly unknown[], + options?: UnionOmit + ] + ) => { + const { args, options } = getFunctionParameters(parameters); + return writeContract(walletClient, { + abi, + address, + functionName, + args, + ...options, + onWrite, + } as unknown as WriteContractOptions); + }; + }, + } + ); + } + + return contract as unknown as GetContractReturnType; +} diff --git a/packages/common/src/getNonceManager.ts b/packages/common/src/getNonceManager.ts new file mode 100644 index 0000000000..46b450910e --- /dev/null +++ b/packages/common/src/getNonceManager.ts @@ -0,0 +1,21 @@ +import { CreateNonceManagerOptions, CreateNonceManagerResult, createNonceManager } from "./createNonceManager"; +import { getNonceManagerId } from "./getNonceManagerId"; + +const nonceManagers = new Map(); + +export async function getNonceManager({ + client, + address, + blockTag = "latest", +}: CreateNonceManagerOptions): Promise { + const id = await getNonceManagerId({ client, address, blockTag }); + + const existingNonceManager = nonceManagers.get(id); + if (existingNonceManager) { + return existingNonceManager; + } + + const nonceManager = createNonceManager({ client, address, blockTag }); + nonceManagers.set(id, nonceManager); + return nonceManager; +} diff --git a/packages/common/src/getNonceManagerId.ts b/packages/common/src/getNonceManagerId.ts new file mode 100644 index 0000000000..85220aae08 --- /dev/null +++ b/packages/common/src/getNonceManagerId.ts @@ -0,0 +1,15 @@ +import { BlockTag, Client, Hex, getAddress } from "viem"; +import { getChainId } from "viem/actions"; + +export async function getNonceManagerId({ + client, + address, + blockTag, +}: { + client: Client; + address: Hex; + blockTag: BlockTag; +}): Promise { + const chainId = client.chain?.id ?? (await getChainId(client)); + return `mud:createNonceManager:${chainId}:${getAddress(address)}:${blockTag}`; +} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index a15afa9877..b772a50ba8 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,11 +1,17 @@ export * from "./common"; export * from "./createBurnerAccount"; -export * from "./createContract"; export * from "./createNonceManager"; +export * from "./getContract"; export * from "./getBurnerPrivateKey"; +export * from "./getNonceManager"; +export * from "./getNonceManagerId"; export * from "./hexToResourceId"; export * from "./readHex"; export * from "./resourceIdToHex"; export * from "./resourceTypes"; export * from "./spliceHex"; export * from "./transportObserver"; +export * from "./writeContract"; + +/** @deprecated use `getContract` instead */ +export { createContract } from "./createContract"; diff --git a/packages/common/src/writeContract.ts b/packages/common/src/writeContract.ts new file mode 100644 index 0000000000..4ce2a9353f --- /dev/null +++ b/packages/common/src/writeContract.ts @@ -0,0 +1,120 @@ +import { + Abi, + Account, + Chain, + Client, + Hex, + SimulateContractParameters, + Transport, + WriteContractParameters, + WriteContractReturnType, +} from "viem"; +import { simulateContract, writeContract as viem_writeContract } from "viem/actions"; +import pRetry from "p-retry"; +import { debug as parentDebug } from "./debug"; +import { getNonceManager } from "./getNonceManager"; +import { parseAccount } from "viem/accounts"; + +const debug = parentDebug.extend("writeContract"); +let nextWriteId = 0; + +export type ContractWrite< + TAbi extends Abi | readonly unknown[] = Abi, + TFunctionName extends string = string, + TChain extends Chain | undefined = Chain, + TAccount extends Account | undefined = Account | undefined, + TChainOverride extends Chain | undefined = Chain | undefined +> = { + id: string; + request: WriteContractParameters; + result: Promise; +}; + +export type WriteContractOptions< + TAbi extends Abi | readonly unknown[] = Abi, + TFunctionName extends string = string, + TChain extends Chain | undefined = Chain, + TAccount extends Account | undefined = Account | undefined, + TChainOverride extends Chain | undefined = Chain | undefined +> = WriteContractParameters & { + onWrite?: (write: ContractWrite) => void; +}; + +// TODO: migrate away from this approach once we can hook into viem's nonce management: https://github.com/wagmi-dev/viem/discussions/1230 + +export async function writeContract< + TChain extends Chain | undefined, + TAccount extends Account | undefined, + TAbi extends Abi | readonly unknown[], + TFunctionName extends string, + TChainOverride extends Chain | undefined +>( + client: Client, + { onWrite, ...request_ }: WriteContractOptions +): Promise { + const request = request_ as WriteContractParameters; + + const account_ = request.account ?? client.account; + if (!account_) { + // TODO: replace with viem AccountNotFoundError once its exported + throw new Error("No account provided"); + } + const account = parseAccount(account_); + + const nonceManager = await getNonceManager({ + client, + address: account.address, + }); + + async function prepareWrite(): Promise< + WriteContractParameters + > { + if (request.gas) { + debug("gas provided, skipping simulate", request); + return request; + } + + debug("simulating write", request); + const result = await simulateContract(client, { + ...request, + account, + } as unknown as SimulateContractParameters); + + return result.request as unknown as WriteContractParameters; + } + + async function write(): Promise { + const preparedWrite = await prepareWrite(); + + return await pRetry( + async () => { + if (!nonceManager.hasNonce()) { + await nonceManager.resetNonce(); + } + + const nonce = nonceManager.nextNonce(); + debug("calling write function with nonce", nonce, preparedWrite); + return await viem_writeContract(client, { nonce, ...preparedWrite } as typeof preparedWrite); + }, + { + retries: 3, + onFailedAttempt: async (error) => { + // On nonce errors, reset the nonce and retry + if (nonceManager.shouldResetNonce(error)) { + debug("got nonce error, retrying", error); + await nonceManager.resetNonce(); + return; + } + // TODO: prepareWrite again if there are gas errors? + throw error; + }, + } + ); + } + + const result = write(); + + onWrite?.({ id: `${nextWriteId++}`, request, result }); + + return result; +} diff --git a/templates/phaser/packages/client/src/mud/createSystemCalls.ts b/templates/phaser/packages/client/src/mud/createSystemCalls.ts index 9a1c478041..b308bd73b2 100644 --- a/templates/phaser/packages/client/src/mud/createSystemCalls.ts +++ b/templates/phaser/packages/client/src/mud/createSystemCalls.ts @@ -24,7 +24,7 @@ export function createSystemCalls( * SetupNetworkResult, as defined in setupNetwork.ts * * - Out of this parameter, we only care about two fields: - * - worldContract (which comes from createContract, see + * - worldContract (which comes from getContract, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/phaser/packages/client/src/mud/setupNetwork.ts#L31). * - waitForTransaction (which comes from syncToRecs, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/phaser/packages/client/src/mud/setupNetwork.ts#L39). diff --git a/templates/phaser/packages/client/src/mud/setupNetwork.ts b/templates/phaser/packages/client/src/mud/setupNetwork.ts index 6fe7d00e2c..0b037665d0 100644 --- a/templates/phaser/packages/client/src/mud/setupNetwork.ts +++ b/templates/phaser/packages/client/src/mud/setupNetwork.ts @@ -9,7 +9,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; /* @@ -58,7 +58,7 @@ export async function setupNetwork() { /* * Create an object for communicating with the deployed World. */ - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/templates/react/packages/client/src/mud/createSystemCalls.ts b/templates/react/packages/client/src/mud/createSystemCalls.ts index 9858910ed2..d351f67040 100644 --- a/templates/react/packages/client/src/mud/createSystemCalls.ts +++ b/templates/react/packages/client/src/mud/createSystemCalls.ts @@ -18,7 +18,7 @@ export function createSystemCalls( * SetupNetworkResult, as defined in setupNetwork.ts * * - Out of this parameter, we only care about two fields: - * - worldContract (which comes from createContract, see + * - worldContract (which comes from getContract, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/react/packages/client/src/mud/setupNetwork.ts#L31). * - waitForTransaction (which comes from syncToRecs, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/react/packages/client/src/mud/setupNetwork.ts#L39). diff --git a/templates/react/packages/client/src/mud/setupNetwork.ts b/templates/react/packages/client/src/mud/setupNetwork.ts index 15d3555441..fe78721b3f 100644 --- a/templates/react/packages/client/src/mud/setupNetwork.ts +++ b/templates/react/packages/client/src/mud/setupNetwork.ts @@ -10,7 +10,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; @@ -60,7 +60,7 @@ export async function setupNetwork() { /* * Create an object for communicating with the deployed World. */ - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/templates/threejs/packages/client/src/mud/createSystemCalls.ts b/templates/threejs/packages/client/src/mud/createSystemCalls.ts index b87d86253d..782f61d94b 100644 --- a/templates/threejs/packages/client/src/mud/createSystemCalls.ts +++ b/templates/threejs/packages/client/src/mud/createSystemCalls.ts @@ -17,7 +17,7 @@ export function createSystemCalls( * SetupNetworkResult, as defined in setupNetwork.ts * * - Out of this parameter, we only care about two fields: - * - worldContract (which comes from createContract, see + * - worldContract (which comes from getContract, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/threejs/packages/client/src/mud/setupNetwork.ts#L31). * - waitForTransaction (which comes from syncToRecs, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/threejs/packages/client/src/mud/setupNetwork.ts#L39). diff --git a/templates/threejs/packages/client/src/mud/setupNetwork.ts b/templates/threejs/packages/client/src/mud/setupNetwork.ts index eb8a98ae84..274a46b80e 100644 --- a/templates/threejs/packages/client/src/mud/setupNetwork.ts +++ b/templates/threejs/packages/client/src/mud/setupNetwork.ts @@ -9,7 +9,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; /* @@ -58,7 +58,7 @@ export async function setupNetwork() { /* * Create an object for communicating with the deployed World. */ - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient, diff --git a/templates/vanilla/packages/client/src/mud/createSystemCalls.ts b/templates/vanilla/packages/client/src/mud/createSystemCalls.ts index 9a364b4920..22449a324f 100644 --- a/templates/vanilla/packages/client/src/mud/createSystemCalls.ts +++ b/templates/vanilla/packages/client/src/mud/createSystemCalls.ts @@ -18,7 +18,7 @@ export function createSystemCalls( * SetupNetworkResult, as defined in setupNetwork.ts * * - Out of this parameter, we only care about two fields: - * - worldContract (which comes from createContract, see + * - worldContract (which comes from getContract, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/vanilla/packages/client/src/mud/setupNetwork.ts#L31). * - waitForTransaction (which comes from syncToRecs, see * https://github.com/latticexyz/mud/blob/26dabb34321eedff7a43f3fcb46da4f3f5ba3708/templates/vanilla/packages/client/src/mud/setupNetwork.ts#L39). diff --git a/templates/vanilla/packages/client/src/mud/setupNetwork.ts b/templates/vanilla/packages/client/src/mud/setupNetwork.ts index 15d3555441..fe78721b3f 100644 --- a/templates/vanilla/packages/client/src/mud/setupNetwork.ts +++ b/templates/vanilla/packages/client/src/mud/setupNetwork.ts @@ -10,7 +10,7 @@ import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs"; import { getNetworkConfig } from "./getNetworkConfig"; import { world } from "./world"; import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json"; -import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common"; +import { createBurnerAccount, getContract, transportObserver, ContractWrite } from "@latticexyz/common"; import { Subject, share } from "rxjs"; @@ -60,7 +60,7 @@ export async function setupNetwork() { /* * Create an object for communicating with the deployed World. */ - const worldContract = createContract({ + const worldContract = getContract({ address: networkConfig.worldAddress as Hex, abi: IWorldAbi, publicClient,