@latticexyz/common 2.0.2 → 2.0.3
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.
- package/dist/actions.d.ts +7 -4
- package/dist/actions.js +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/chunk-3C73TF65.js +2 -0
- package/dist/chunk-3C73TF65.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/actions/transactionQueue.ts +12 -6
- package/src/actions/writeObserver.ts +2 -2
- package/src/createBurnerAccount.ts +2 -2
- package/src/getContract.ts +6 -2
- package/src/sendTransaction.ts +12 -10
- package/src/writeContract.ts +15 -7
- package/dist/chunk-PEY5BGLC.js +0 -2
- package/dist/chunk-PEY5BGLC.js.map +0 -1
package/dist/actions.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { Chain,
|
|
1
|
+
import { Chain, PublicClient, Transport, Account, Client, WalletActions } from 'viem';
|
|
2
2
|
import { C as ContractWrite } from './getContract-93922960.js';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
type TransactionQueueOptions<chain extends Chain> = {
|
|
5
|
+
publicClient?: PublicClient<Transport, chain>;
|
|
6
|
+
};
|
|
7
|
+
declare function transactionQueue<chain extends Chain, account extends Account>({ publicClient, }?: TransactionQueueOptions<chain>): (client: Client<Transport, chain, account>) => Pick<WalletActions<chain, account>, "writeContract" | "sendTransaction">;
|
|
5
8
|
|
|
6
9
|
type WriteObserverParameters = {
|
|
7
10
|
onWrite: (write: ContractWrite) => void;
|
|
8
11
|
};
|
|
9
|
-
declare function writeObserver<TChain extends Chain, TAccount extends Account>({ onWrite, }: WriteObserverParameters): (client:
|
|
12
|
+
declare function writeObserver<TChain extends Chain, TAccount extends Account>({ onWrite, }: WriteObserverParameters): (client: Client<Transport, TChain, TAccount>) => Pick<WalletActions<TChain, TAccount>, "writeContract">;
|
|
10
13
|
|
|
11
|
-
export { transactionQueue, writeObserver };
|
|
14
|
+
export { TransactionQueueOptions, transactionQueue, writeObserver };
|
package/dist/actions.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as
|
|
1
|
+
import{d as o,e as a}from"./chunk-3C73TF65.js";import"./chunk-TCWGPC6G.js";function m({publicClient:r}={}){return n=>({writeContract:t=>o(n,t,r),sendTransaction:t=>a(n,t,r)})}import{getAction as s}from"viem/utils";import{writeContract as u}from"viem/actions";function h({onWrite:r}){let n=0;return t=>({writeContract:e=>{let i=s(t,u,"writeContract")(e),c=`${t.chain.id}:${t.account.address}:${n++}`;return r({id:c,request:e,result:i}),i}})}export{m as transactionQueue,h as writeObserver};
|
|
2
2
|
//# sourceMappingURL=actions.js.map
|
package/dist/actions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/actions/transactionQueue.ts","../src/actions/writeObserver.ts"],"sourcesContent":["import type { Transport, Chain, Account, WalletActions,
|
|
1
|
+
{"version":3,"sources":["../src/actions/transactionQueue.ts","../src/actions/writeObserver.ts"],"sourcesContent":["import type { Transport, Chain, Account, WalletActions, Client, PublicClient } from \"viem\";\nimport { writeContract as mud_writeContract } from \"../writeContract\";\nimport { sendTransaction as mud_sendTransaction } from \"../sendTransaction\";\n\nexport type TransactionQueueOptions<chain extends Chain> = {\n publicClient?: PublicClient<Transport, chain>;\n};\n\nexport function transactionQueue<chain extends Chain, account extends Account>({\n publicClient,\n}: TransactionQueueOptions<chain> = {}): (\n client: Client<Transport, chain, account>,\n) => Pick<WalletActions<chain, account>, \"writeContract\" | \"sendTransaction\"> {\n return (client) => ({\n // Applies to: `client.writeContract`, `getContract(client, ...).write`\n writeContract: (args) => mud_writeContract(client, args, publicClient),\n // Applies to: `client.sendTransaction`\n sendTransaction: (args) => mud_sendTransaction(client, args, publicClient),\n });\n}\n","import type {\n WriteContractParameters,\n Transport,\n Chain,\n Account,\n WalletActions,\n WriteContractReturnType,\n Client,\n} from \"viem\";\nimport { getAction } from \"viem/utils\";\nimport { writeContract } from \"viem/actions\";\nimport { type ContractWrite } from \"../getContract\";\n\ntype WriteObserverParameters = { onWrite: (write: ContractWrite) => void };\n\nexport function writeObserver<TChain extends Chain, TAccount extends Account>({\n onWrite,\n}: WriteObserverParameters): (\n client: Client<Transport, TChain, TAccount>,\n) => Pick<WalletActions<TChain, TAccount>, \"writeContract\"> {\n let nextWriteId = 0;\n\n return (client) => ({\n // Applies to: `client.writeContract`, `getContract(client, ...).write`\n writeContract: (args): Promise<WriteContractReturnType> => {\n const result = getAction(client, writeContract, \"writeContract\")(args);\n\n const id = `${client.chain.id}:${client.account.address}:${nextWriteId++}`;\n onWrite({ id, request: args as WriteContractParameters, result });\n\n return result;\n },\n });\n}\n"],"mappings":"2EAQO,SAASA,EAA+D,CAC7E,aAAAC,CACF,EAAoC,CAAC,EAEyC,CAC5E,OAAQC,IAAY,CAElB,cAAgBC,GAASC,EAAkBF,EAAQC,EAAMF,CAAY,EAErE,gBAAkBE,GAASE,EAAoBH,EAAQC,EAAMF,CAAY,CAC3E,EACF,CCVA,OAAS,aAAAK,MAAiB,aAC1B,OAAS,iBAAAC,MAAqB,eAKvB,SAASC,EAA8D,CAC5E,QAAAC,CACF,EAE4D,CAC1D,IAAIC,EAAc,EAElB,OAAQC,IAAY,CAElB,cAAgBC,GAA2C,CACzD,IAAMC,EAASP,EAAUK,EAAQJ,EAAe,eAAe,EAAEK,CAAI,EAE/DE,EAAK,GAAGH,EAAO,MAAM,MAAMA,EAAO,QAAQ,WAAWD,MAC3D,OAAAD,EAAQ,CAAE,GAAAK,EAAI,QAASF,EAAiC,OAAAC,CAAO,CAAC,EAEzDA,CACT,CACF,EACF","names":["transactionQueue","publicClient","client","args","writeContract","sendTransaction","getAction","writeContract","writeObserver","onWrite","nextWriteId","client","args","result","id"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as d}from"./chunk-TCWGPC6G.js";import{getAddress as y}from"viem";import{getChainId as M}from"viem/actions";async function g({client:a,address:n,blockTag:o}){return`mud:createNonceManager:${a.chain?.id??await M(a)}:${y(n)}:${o}`}import{BaseError as P,NonceTooHighError as v,NonceTooLowError as O}from"viem";import{getTransactionCount as R}from"viem/actions";import k from"p-queue";var C=d.extend("createNonceManager");function w({client:a,address:n,blockTag:o="pending",broadcastChannelName:c}){let r={current:-1},e=null;typeof BroadcastChannel<"u"&&(c?Promise.resolve(c):g({client:a,address:n,blockTag:o})).then(m=>{e=new BroadcastChannel(m),e.addEventListener("message",x=>{let N=JSON.parse(x.data);C("got nonce from broadcast channel",N),r.current=N})});function u(){return r.current>=0}function t(){if(!u())throw new Error("call resetNonce before using nextNonce");let s=r.current++;return e?.postMessage(JSON.stringify(r.current)),s}async function i(){let s=await R(a,{address:n,blockTag:o});r.current=s,e?.postMessage(JSON.stringify(r.current)),C("reset nonce to",r.current)}function h(s){return s instanceof P&&s.walk(m=>m instanceof O||m instanceof v)!=null}let T=new k({concurrency:1});return{hasNonce:u,nextNonce:t,resetNonce:i,shouldResetNonce:h,mempoolQueue:T}}var b=new Map;async function p({client:a,address:n,blockTag:o="pending"}){let c=await g({client:a,address:n,blockTag:o}),r=b.get(c);if(r)return r;let e=w({client:a,address:n,blockTag:o});return b.set(c,e),e}import{simulateContract as A,writeContract as S}from"viem/actions";import W from"p-retry";import{parseAccount as B}from"viem/accounts";var l=d.extend("writeContract");async function dn(a,n,o){let c=n.account??a.account;if(!c)throw new Error("No account provided");let r=B(c),e=await p({client:o??a,address:r.address,blockTag:"pending"});async function u(){return n.gas?(l("gas provided, skipping simulate",n.functionName,n.address),n):(l("simulating",n.functionName,"at",n.address),(await A(o??a,{...n,blockTag:"pending",account:r})).request)}return e.mempoolQueue.add(()=>W(async()=>{let t=await u();e.hasNonce()||await e.resetNonce();let i=e.nextNonce();return l("calling",t.functionName,"with nonce",i,"at",t.address),await S(a,{nonce:i,...t})},{retries:3,onFailedAttempt:async t=>{if(e.shouldResetNonce(t)){l("got nonce error, retrying",t.message),await e.resetNonce();return}throw t}}),{throwOnTimeout:!0})}import{call as E,sendTransaction as F}from"viem/actions";import I from"p-retry";import{parseAccount as Q}from"viem/accounts";var f=d.extend("sendTransaction");async function Nn(a,n,o){let c=n.account??a.account;if(!c)throw new Error("No account provided");let r=Q(c),e=await p({client:o??a,address:r.address,blockTag:"pending"});async function u(){return n.gas?(f("gas provided, skipping simulate",n.to),n):(f("simulating tx to",n.to),await E(o??a,{...n,blockTag:"pending",account:r}),n)}return await e.mempoolQueue.add(()=>I(async()=>{let t=await u();e.hasNonce()||await e.resetNonce();let i=e.nextNonce();f("sending tx with nonce",i,"to",t.to);let h={nonce:i,...t};return await F(a,h)},{retries:3,onFailedAttempt:async t=>{if(e.shouldResetNonce(t)){f("got nonce error, retrying",t.message),await e.resetNonce();return}throw t}}),{throwOnTimeout:!0})}export{g as a,w as b,p as c,dn as d,Nn as e};
|
|
2
|
+
//# sourceMappingURL=chunk-3C73TF65.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/getNonceManagerId.ts","../src/createNonceManager.ts","../src/getNonceManager.ts","../src/writeContract.ts","../src/sendTransaction.ts"],"sourcesContent":["import { BlockTag, Client, Hex, getAddress } from \"viem\";\nimport { getChainId } from \"viem/actions\";\n\nexport async function getNonceManagerId({\n client,\n address,\n blockTag,\n}: {\n client: Client;\n address: Hex;\n blockTag: BlockTag;\n}): Promise<string> {\n // TODO: improve this so we don't have to call getChainId every time\n const chainId = client.chain?.id ?? (await getChainId(client));\n return `mud:createNonceManager:${chainId}:${getAddress(address)}:${blockTag}`;\n}\n","import { BaseError, BlockTag, Client, Hex, NonceTooHighError, NonceTooLowError } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManagerId } from \"./getNonceManagerId\";\nimport { getTransactionCount } from \"viem/actions\";\nimport PQueue from \"p-queue\";\n\nconst debug = parentDebug.extend(\"createNonceManager\");\n\nexport type CreateNonceManagerOptions = {\n client: Client;\n address: Hex;\n blockTag?: BlockTag;\n broadcastChannelName?: string;\n};\n\nexport type CreateNonceManagerResult = {\n hasNonce: () => boolean;\n nextNonce: () => number;\n resetNonce: () => Promise<void>;\n shouldResetNonce: (error: unknown) => boolean;\n mempoolQueue: PQueue;\n};\n\nexport function createNonceManager({\n client,\n address, // TODO: rename to account?\n blockTag = \"pending\",\n broadcastChannelName,\n}: CreateNonceManagerOptions): CreateNonceManagerResult {\n const nonceRef = { current: -1 };\n let channel: BroadcastChannel | null = null;\n\n if (typeof BroadcastChannel !== \"undefined\") {\n const channelName = broadcastChannelName\n ? Promise.resolve(broadcastChannelName)\n : getNonceManagerId({ client, address, blockTag });\n channelName.then((name) => {\n channel = new BroadcastChannel(name);\n // TODO: emit some sort of \"connected\" event so other channels can broadcast current nonce\n channel.addEventListener(\"message\", (event) => {\n const nonce = JSON.parse(event.data);\n debug(\"got nonce from broadcast channel\", nonce);\n nonceRef.current = nonce;\n });\n });\n }\n\n function hasNonce(): boolean {\n return nonceRef.current >= 0;\n }\n\n function nextNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using nextNonce\");\n const nonce = nonceRef.current++;\n channel?.postMessage(JSON.stringify(nonceRef.current));\n return nonce;\n }\n\n async function resetNonce(): Promise<void> {\n const nonce = await getTransactionCount(client, { address, blockTag });\n nonceRef.current = nonce;\n channel?.postMessage(JSON.stringify(nonceRef.current));\n debug(\"reset nonce to\", nonceRef.current);\n }\n\n function shouldResetNonce(error: unknown): boolean {\n return (\n error instanceof BaseError &&\n error.walk((e) => e instanceof NonceTooLowError || e instanceof NonceTooHighError) != null\n );\n }\n\n const mempoolQueue = new PQueue({ concurrency: 1 });\n\n return {\n hasNonce,\n nextNonce,\n resetNonce,\n shouldResetNonce,\n mempoolQueue,\n };\n}\n","import { CreateNonceManagerOptions, CreateNonceManagerResult, createNonceManager } from \"./createNonceManager\";\nimport { getNonceManagerId } from \"./getNonceManagerId\";\n\nconst nonceManagers = new Map<string, CreateNonceManagerResult>();\n\nexport async function getNonceManager({\n client,\n address, // TODO: rename to account?\n blockTag = \"pending\",\n}: CreateNonceManagerOptions): Promise<CreateNonceManagerResult> {\n const id = await getNonceManagerId({ client, address, blockTag });\n\n const existingNonceManager = nonceManagers.get(id);\n if (existingNonceManager) {\n return existingNonceManager;\n }\n\n const nonceManager = createNonceManager({ client, address, blockTag });\n nonceManagers.set(id, nonceManager);\n return nonceManager;\n}\n","import {\n Abi,\n Account,\n Chain,\n Client,\n SimulateContractParameters,\n Transport,\n WriteContractParameters,\n WriteContractReturnType,\n ContractFunctionName,\n ContractFunctionArgs,\n PublicClient,\n} from \"viem\";\nimport { simulateContract, writeContract as viem_writeContract } from \"viem/actions\";\nimport pRetry from \"p-retry\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManager } from \"./getNonceManager\";\nimport { parseAccount } from \"viem/accounts\";\n\nconst debug = parentDebug.extend(\"writeContract\");\n\n// TODO: migrate away from this approach once we can hook into viem's nonce management: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function writeContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"nonpayable\" | \"payable\">,\n args extends ContractFunctionArgs<abi, \"nonpayable\" | \"payable\", functionName>,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain, account>,\n request: WriteContractParameters<abi, functionName, args, chain, account, chainOverride>,\n publicClient?: PublicClient<Transport, chain>,\n): Promise<WriteContractReturnType> {\n const rawAccount = request.account ?? client.account;\n if (!rawAccount) {\n // TODO: replace with viem AccountNotFoundError once its exported\n throw new Error(\"No account provided\");\n }\n const account = parseAccount(rawAccount);\n\n const nonceManager = await getNonceManager({\n client: publicClient ?? client,\n address: account.address,\n blockTag: \"pending\",\n });\n\n async function prepareWrite(): Promise<\n WriteContractParameters<abi, functionName, args, chain, account, chainOverride>\n > {\n if (request.gas) {\n debug(\"gas provided, skipping simulate\", request.functionName, request.address);\n return request;\n }\n\n debug(\"simulating\", request.functionName, \"at\", request.address);\n const result = await simulateContract<chain, account | undefined, abi, functionName, args, chainOverride>(\n publicClient ?? client,\n {\n ...request,\n blockTag: \"pending\",\n account,\n } as unknown as SimulateContractParameters<abi, functionName, args, chain, chainOverride>,\n );\n\n return result.request as unknown as WriteContractParameters<abi, functionName, args, chain, account, chainOverride>;\n }\n\n return nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const preparedWrite = await prepareWrite();\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n const nonce = nonceManager.nextNonce();\n debug(\"calling\", preparedWrite.functionName, \"with nonce\", nonce, \"at\", preparedWrite.address);\n return await viem_writeContract(client, {\n nonce,\n ...preparedWrite,\n } as typeof preparedWrite);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // On nonce errors, reset the nonce and retry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n await nonceManager.resetNonce();\n return;\n }\n // TODO: prepareWrite again if there are gas errors?\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n","import {\n Account,\n CallParameters,\n Chain,\n Client,\n SendTransactionParameters,\n Transport,\n SendTransactionReturnType,\n PublicClient,\n} from \"viem\";\nimport { call, sendTransaction as viem_sendTransaction } from \"viem/actions\";\nimport pRetry from \"p-retry\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManager } from \"./getNonceManager\";\nimport { parseAccount } from \"viem/accounts\";\n\nconst debug = parentDebug.extend(\"sendTransaction\");\n\n// TODO: migrate away from this approach once we can hook into viem's nonce management: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function sendTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain, account>,\n request: SendTransactionParameters<chain, account, chainOverride>,\n publicClient?: PublicClient<Transport, chain>,\n): Promise<SendTransactionReturnType> {\n const rawAccount = request.account ?? client.account;\n if (!rawAccount) {\n // TODO: replace with viem AccountNotFoundError once its exported\n throw new Error(\"No account provided\");\n }\n const account = parseAccount(rawAccount);\n\n const nonceManager = await getNonceManager({\n client: publicClient ?? client,\n address: account.address,\n blockTag: \"pending\",\n });\n\n async function prepare(): Promise<SendTransactionParameters<chain, account, chainOverride>> {\n if (request.gas) {\n debug(\"gas provided, skipping simulate\", request.to);\n return request;\n }\n\n debug(\"simulating tx to\", request.to);\n await call(publicClient ?? client, {\n ...request,\n blockTag: \"pending\",\n account,\n } as CallParameters<chain>);\n\n return request;\n }\n\n return await nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const preparedRequest = await prepare();\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n const nonce = nonceManager.nextNonce();\n debug(\"sending tx with nonce\", nonce, \"to\", preparedRequest.to);\n const parameters: SendTransactionParameters<chain, account, chainOverride> = { nonce, ...preparedRequest };\n return await viem_sendTransaction(client, parameters);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // On nonce errors, reset the nonce and retry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n await nonceManager.resetNonce();\n return;\n }\n // TODO: prepare again if there are gas errors?\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n"],"mappings":"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","names":["getAddress","getChainId","getNonceManagerId","client","address","blockTag","BaseError","NonceTooHighError","NonceTooLowError","getTransactionCount","PQueue","debug","createNonceManager","client","address","blockTag","broadcastChannelName","nonceRef","channel","getNonceManagerId","name","event","nonce","hasNonce","nextNonce","resetNonce","shouldResetNonce","error","BaseError","e","NonceTooLowError","NonceTooHighError","mempoolQueue","nonceManagers","getNonceManager","client","address","blockTag","id","getNonceManagerId","existingNonceManager","nonceManager","createNonceManager","simulateContract","viem_writeContract","pRetry","parseAccount","debug","writeContract","client","request","publicClient","rawAccount","account","nonceManager","getNonceManager","prepareWrite","simulateContract","pRetry","preparedWrite","nonce","viem_writeContract","error","call","viem_sendTransaction","pRetry","parseAccount","debug","sendTransaction","client","request","publicClient","rawAccount","account","nonceManager","getNonceManager","prepare","call","pRetry","preparedRequest","nonce","parameters","viem_sendTransaction","error"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Hex,
|
|
1
|
+
import { Hex, PrivateKeyAccount, Client, BlockTag, Chain, Account, Transport, SendTransactionParameters, PublicClient, SendTransactionReturnType, Abi, ContractFunctionName, ContractFunctionArgs, WriteContractParameters, WriteContractReturnType } from 'viem';
|
|
2
2
|
import PQueue from 'p-queue';
|
|
3
3
|
import { g as getContract } from './getContract-93922960.js';
|
|
4
4
|
export { C as ContractWrite, G as GetContractOptions } from './getContract-93922960.js';
|
|
@@ -15,7 +15,7 @@ type Resource = {
|
|
|
15
15
|
|
|
16
16
|
declare function createBenchmark(namespace: string): (stepName: string) => void;
|
|
17
17
|
|
|
18
|
-
declare function createBurnerAccount(privateKey: Hex):
|
|
18
|
+
declare function createBurnerAccount(privateKey: Hex): PrivateKeyAccount;
|
|
19
19
|
|
|
20
20
|
type CreateNonceManagerOptions = {
|
|
21
21
|
client: Client;
|
|
@@ -86,14 +86,14 @@ declare function isError<Ok, Err>(result: Result<Ok, Err>): result is {
|
|
|
86
86
|
declare function unwrap<Ok, Err>(result: Result<Ok, Err>): Ok;
|
|
87
87
|
|
|
88
88
|
/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */
|
|
89
|
-
declare function sendTransaction<
|
|
89
|
+
declare function sendTransaction<chain extends Chain | undefined, account extends Account | undefined, chainOverride extends Chain | undefined>(client: Client<Transport, chain, account>, request: SendTransactionParameters<chain, account, chainOverride>, publicClient?: PublicClient<Transport, chain>): Promise<SendTransactionReturnType>;
|
|
90
90
|
|
|
91
91
|
declare function spliceHex(data: Hex, start: number, deleteCount?: number, newData?: Hex): Hex;
|
|
92
92
|
|
|
93
93
|
declare function transportObserver<TTransport extends Transport>(transport: TTransport): TTransport;
|
|
94
94
|
|
|
95
95
|
/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */
|
|
96
|
-
declare function writeContract<chain extends Chain | undefined, account extends Account | undefined, abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, "nonpayable" | "payable">, args extends ContractFunctionArgs<abi, "nonpayable" | "payable", functionName>, chainOverride extends Chain | undefined>(client: Client<Transport, chain, account>, request: WriteContractParameters<abi, functionName, args, chain, account, chainOverride>): Promise<WriteContractReturnType>;
|
|
96
|
+
declare function writeContract<chain extends Chain | undefined, account extends Account | undefined, abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, "nonpayable" | "payable">, args extends ContractFunctionArgs<abi, "nonpayable" | "payable", functionName>, chainOverride extends Chain | undefined>(client: Client<Transport, chain, account>, request: WriteContractParameters<abi, functionName, args, chain, account, chainOverride>, publicClient?: PublicClient<Transport, chain>): Promise<WriteContractReturnType>;
|
|
97
97
|
|
|
98
98
|
/** @deprecated use `getContract` instead */
|
|
99
99
|
declare const createContract: typeof getContract;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as S,b as $,c as q,d as l,e as j}from"./chunk-3C73TF65.js";import{a as B,b as D,c as x,d as _,e as T}from"./chunk-6NUUDPWM.js";import{a as p}from"./chunk-TCWGPC6G.js";import y from"debug";var m=y("mud:benchmark");m.log=console.info.bind(console);function L(t){let r=m.extend(t),e=performance.now();return n=>{let o=(performance.now()-e)/1e3;r("%s: +%ds",n,o),e=performance.now()}}import{privateKeyToAccount as w}from"viem/accounts";function M(t){return{...w(t)}}import{getContract as P}from"viem";function h(t){let r=t.length&&Array.isArray(t[0]),e=r?t[0]:[],n=(r?t[1]:t[0])??{};return{args:e,options:n}}function d({abi:t,address:r,client:{public:e,wallet:n},onWrite:o}){let s=P({abi:t,address:r,client:{public:e,wallet:n}});if(s.write){let a=0;s.write=new Proxy({},{get(N,C){return(...b)=>{let{args:A,options:g}=h(b),c={abi:t,address:r,functionName:C,args:A,...g,onWrite:o},u=l(n,c,e),k=`${n.chain.id}:${n.account.address}:${a++}`;return o?.({id:k,request:c,result:u}),u}}})}return s}import{generatePrivateKey as H,privateKeyToAccount as f}from"viem/accounts";import{isHex as W}from"viem";function O(t,r){if(!W(t))throw console.error("Private key found in cache is not valid hex",{privateKey:t,cacheKey:r}),new Error(`Private key found in cache (${r}) is not valid hex`);f(t)}function Tt(t="mud:burnerWallet"){let r=localStorage.getItem(t);if(r!=null)return O(r,t),r;let e=H();return console.log("New burner wallet created:",f(e)),localStorage.setItem(t,e),e}function i(t,r,e){return`0x${t.replace(/^0x/,"").slice(r*2,e!=null?e*2:void 0).padEnd(((e??r)-r)*2,"0")}`}function ft(t){return"ok"in t}function v(t){return"error"in t}function Ct(t){if(v(t))throw t.error;return t.ok}import{concatHex as E}from"viem";function yt(t,r,e=0,n="0x"){return E([i(t,0,r),n,i(t,r+e)])}import{keccak256 as R}from"viem";var G=p.extend("transportObserver");function Ot(t){return r=>{let e=t(r);return{...e,request:async o=>{if(o.method==="eth_sendRawTransaction"&&o.params instanceof Array){let s=o.params.map(a=>R(a));G("saw txs",s)}return e.request(o)}}}}var I=d;var F=x;var K=T;export{L as createBenchmark,M as createBurnerAccount,I as createContract,$ as createNonceManager,Tt as getBurnerPrivateKey,d as getContract,q as getNonceManager,S as getNonceManagerId,T as hexToResource,K as hexToResourceId,v as isError,ft as isOk,i as readHex,F as resourceIdToHex,x as resourceToHex,_ as resourceToLabel,D as resourceTypeIds,B as resourceTypes,j as sendTransaction,yt as spliceHex,Ot as transportObserver,Ct as unwrap,l as writeContract};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createBenchmark.ts","../src/createBurnerAccount.ts","../src/getContract.ts","../src/getBurnerPrivateKey.ts","../src/readHex.ts","../src/result.ts","../src/spliceHex.ts","../src/transportObserver.ts","../src/deprecated/createContract.ts","../src/deprecated/resourceIdToHex.ts","../src/deprecated/hexToResourceId.ts"],"sourcesContent":["import createDebug from \"debug\";\n\nconst parentDebug = createDebug(\"mud:benchmark\");\n\n// Pipe debug output to stdout instead of stderr\nparentDebug.log = console.info.bind(console);\n\nexport function createBenchmark(namespace: string): (stepName: string) => void {\n const debug = parentDebug.extend(namespace);\n let lastStep = performance.now();\n\n return (stepName: string) => {\n const secondsSinceLastStep = (performance.now() - lastStep) / 1000;\n debug(\"%s: +%ds\", stepName, secondsSinceLastStep);\n lastStep = performance.now();\n };\n}\n","import { Account, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport function createBurnerAccount(privateKey: Hex): Account {\n const account = privateKeyToAccount(privateKey);\n // We may override account features here\n return {\n ...account,\n };\n}\n","import {\n Abi,\n Account,\n Address,\n Chain,\n GetContractParameters,\n GetContractReturnType,\n Hex,\n PublicClient,\n Transport,\n WalletClient,\n WriteContractParameters,\n type ContractFunctionName,\n type ContractFunctionArgs,\n getContract as viem_getContract,\n} from \"viem\";\nimport { UnionOmit } from \"./type-utils/common\";\nimport { writeContract } from \"./writeContract\";\n\n// copied from viem because this isn't exported\n// TODO: import from viem?\nfunction getFunctionParameters(values: [args?: readonly unknown[], options?: object]): {\n args: readonly unknown[];\n options: object;\n} {\n const hasArgs = values.length && Array.isArray(values[0]);\n const args = hasArgs ? values[0]! : [];\n const options = (hasArgs ? values[1] : values[0]) ?? {};\n return { args, options };\n}\n\nexport type ContractWrite = {\n id: string;\n request: WriteContractParameters;\n result: Promise<Hex>;\n};\n\nexport type GetContractOptions<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n> = GetContractParameters<\n TTransport,\n TChain,\n TAccount,\n TAbi,\n { public: TPublicClient; wallet: TWalletClient },\n TAddress\n> & {\n onWrite?: (write: ContractWrite) => void;\n};\n\n// TODO: migrate away from this approach once we can hook into viem: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue()).extend(writeObserver({ onWrite }))` and viem's `getContract` instead. */\nexport function getContract<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n>({\n abi,\n address,\n client: { public: publicClient, wallet: walletClient },\n onWrite,\n}: GetContractOptions<\n TTransport,\n TAddress,\n TAbi,\n TChain,\n TAccount,\n TPublicClient,\n TWalletClient\n>): GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> {\n const contract = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as unknown as GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n };\n\n if (contract.write) {\n // Replace write calls with our own. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries).\n let nextWriteId = 0;\n contract.write = new Proxy(\n {},\n {\n get(_, functionName: string) {\n return (\n ...parameters: [\n args?: readonly unknown[],\n options?: UnionOmit<WriteContractParameters, \"abi\" | \"address\" | \"functionName\" | \"args\">,\n ]\n ) => {\n const { args, options } = getFunctionParameters(parameters);\n const request = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as unknown as WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n >;\n const result = writeContract(walletClient, request);\n\n const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;\n onWrite?.({ id, request: request as WriteContractParameters, result });\n\n return result;\n };\n },\n },\n );\n }\n\n return contract as unknown as GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress>;\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { isHex, Hex } from \"viem\";\n\nfunction assertPrivateKey(privateKey: string, cacheKey: string): asserts privateKey is Hex {\n if (!isHex(privateKey)) {\n console.error(\"Private key found in cache is not valid hex\", { privateKey, cacheKey });\n throw new Error(`Private key found in cache (${cacheKey}) is not valid hex`);\n }\n // ensure we can extract address from private key\n // this should throw on bad private keys\n privateKeyToAccount(privateKey);\n}\n\nexport function getBurnerPrivateKey(cacheKey = \"mud:burnerWallet\"): Hex {\n const cachedPrivateKey = localStorage.getItem(cacheKey);\n\n if (cachedPrivateKey != null) {\n assertPrivateKey(cachedPrivateKey, cacheKey);\n return cachedPrivateKey;\n }\n\n const privateKey = generatePrivateKey();\n console.log(\"New burner wallet created:\", privateKeyToAccount(privateKey));\n localStorage.setItem(cacheKey, privateKey);\n return privateKey;\n}\n","import { Hex } from \"viem\";\n\n/**\n * Get the hex value at start/end positions. This will always return a valid hex string.\n *\n * If `start` is out of range, this returns `\"0x\"`.\n *\n * If `end` is specified and out of range, the result is right zero-padded to the desired length (`end - start`).\n */\nexport function readHex(data: Hex, start: number, end?: number): Hex {\n return `0x${data\n .replace(/^0x/, \"\")\n .slice(start * 2, end != null ? end * 2 : undefined)\n .padEnd(((end ?? start) - start) * 2, \"0\")}`;\n}\n","// Inspired by https://doc.rust-lang.org/std/result/\nexport type Result<Ok, Err = unknown> = { ok: Ok } | { error: Err };\n\nexport function isOk<Ok, Err>(result: Result<Ok, Err>): result is { ok: Ok } {\n return \"ok\" in result;\n}\n\nexport function isError<Ok, Err>(result: Result<Ok, Err>): result is { error: Err } {\n return \"error\" in result;\n}\n\nexport function unwrap<Ok, Err>(result: Result<Ok, Err>): Ok {\n if (isError(result)) {\n throw result.error;\n }\n return result.ok;\n}\n","import { Hex, concatHex } from \"viem\";\nimport { readHex } from \"./readHex\";\n\nexport function spliceHex(data: Hex, start: number, deleteCount = 0, newData: Hex = \"0x\"): Hex {\n return concatHex([readHex(data, 0, start), newData, readHex(data, start + deleteCount)]);\n}\n","import { Hex, Transport, keccak256 } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\n\nconst debug = parentDebug.extend(\"transportObserver\");\n\nexport function transportObserver<TTransport extends Transport>(transport: TTransport): TTransport {\n return ((opts) => {\n const result = transport(opts);\n const request: typeof result.request = async (req) => {\n if (req.method === \"eth_sendRawTransaction\" && req.params instanceof Array) {\n const txs = req.params.map((data: Hex) => keccak256(data));\n debug(\"saw txs\", txs);\n // TODO: pass these tx hashes into dev tools\n }\n // TODO: add support for `eth_sendTransaction`\n return result.request(req);\n };\n return {\n ...result,\n request,\n };\n }) as TTransport;\n}\n","import { getContract } from \"../getContract\";\n\n/** @deprecated use `getContract` instead */\nexport const createContract = getContract;\n","import { resourceToHex } from \"../resourceToHex\";\n\n/** @deprecated use `resourceToHex` instead */\nexport const resourceIdToHex = resourceToHex;\n","import { hexToResource } from \"../hexToResource\";\n\n/** @deprecated use `hexToResource` instead */\nexport const hexToResourceId = hexToResource;\n"],"mappings":"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","names":["createDebug","parentDebug","createBenchmark","namespace","debug","lastStep","stepName","secondsSinceLastStep","privateKeyToAccount","createBurnerAccount","privateKey","viem_getContract","getFunctionParameters","values","hasArgs","args","options","getContract","abi","address","publicClient","walletClient","onWrite","contract","viem_getContract","nextWriteId","_","functionName","parameters","request","result","writeContract","id","generatePrivateKey","privateKeyToAccount","isHex","assertPrivateKey","privateKey","cacheKey","getBurnerPrivateKey","cachedPrivateKey","readHex","data","start","end","isOk","result","isError","unwrap","concatHex","spliceHex","data","start","deleteCount","newData","concatHex","readHex","keccak256","debug","transportObserver","transport","opts","result","req","txs","data","keccak256","createContract","getContract","resourceIdToHex","resourceToHex","hexToResourceId","hexToResource"]}
|
|
1
|
+
{"version":3,"sources":["../src/createBenchmark.ts","../src/createBurnerAccount.ts","../src/getContract.ts","../src/getBurnerPrivateKey.ts","../src/readHex.ts","../src/result.ts","../src/spliceHex.ts","../src/transportObserver.ts","../src/deprecated/createContract.ts","../src/deprecated/resourceIdToHex.ts","../src/deprecated/hexToResourceId.ts"],"sourcesContent":["import createDebug from \"debug\";\n\nconst parentDebug = createDebug(\"mud:benchmark\");\n\n// Pipe debug output to stdout instead of stderr\nparentDebug.log = console.info.bind(console);\n\nexport function createBenchmark(namespace: string): (stepName: string) => void {\n const debug = parentDebug.extend(namespace);\n let lastStep = performance.now();\n\n return (stepName: string) => {\n const secondsSinceLastStep = (performance.now() - lastStep) / 1000;\n debug(\"%s: +%ds\", stepName, secondsSinceLastStep);\n lastStep = performance.now();\n };\n}\n","import { Hex, PrivateKeyAccount } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport function createBurnerAccount(privateKey: Hex): PrivateKeyAccount {\n const account = privateKeyToAccount(privateKey);\n // We may override account features here\n return {\n ...account,\n };\n}\n","import {\n Abi,\n Account,\n Address,\n Chain,\n GetContractParameters,\n GetContractReturnType,\n Hex,\n PublicClient,\n Transport,\n WalletClient,\n WriteContractParameters,\n type ContractFunctionName,\n type ContractFunctionArgs,\n getContract as viem_getContract,\n} from \"viem\";\nimport { UnionOmit } from \"./type-utils/common\";\nimport { writeContract } from \"./writeContract\";\n\n// copied from viem because this isn't exported\n// TODO: import from viem?\nfunction getFunctionParameters(values: [args?: readonly unknown[], options?: object]): {\n args: readonly unknown[];\n options: object;\n} {\n const hasArgs = values.length && Array.isArray(values[0]);\n const args = hasArgs ? values[0]! : [];\n const options = (hasArgs ? values[1] : values[0]) ?? {};\n return { args, options };\n}\n\nexport type ContractWrite = {\n id: string;\n request: WriteContractParameters;\n result: Promise<Hex>;\n};\n\nexport type GetContractOptions<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n> = GetContractParameters<\n TTransport,\n TChain,\n TAccount,\n TAbi,\n { public: TPublicClient; wallet: TWalletClient },\n TAddress\n> & {\n onWrite?: (write: ContractWrite) => void;\n};\n\n// TODO: migrate away from this approach once we can hook into viem: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue()).extend(writeObserver({ onWrite }))` and viem's `getContract` instead. */\nexport function getContract<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n>({\n abi,\n address,\n client: { public: publicClient, wallet: walletClient },\n onWrite,\n}: GetContractOptions<\n TTransport,\n TAddress,\n TAbi,\n TChain,\n TAccount,\n TPublicClient,\n TWalletClient\n>): GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> {\n const contract = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as unknown as GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n };\n\n if (contract.write) {\n // Replace write calls with our own. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries).\n let nextWriteId = 0;\n contract.write = new Proxy(\n {},\n {\n get(_, functionName: string) {\n return (\n ...parameters: [\n args?: readonly unknown[],\n options?: UnionOmit<WriteContractParameters, \"abi\" | \"address\" | \"functionName\" | \"args\">,\n ]\n ) => {\n const { args, options } = getFunctionParameters(parameters);\n const request = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as unknown as WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n >;\n const result = writeContract(walletClient, request, publicClient);\n\n const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;\n onWrite?.({\n id,\n request: request as WriteContractParameters,\n result,\n });\n\n return result;\n };\n },\n },\n );\n }\n\n return contract as unknown as GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress>;\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { isHex, Hex } from \"viem\";\n\nfunction assertPrivateKey(privateKey: string, cacheKey: string): asserts privateKey is Hex {\n if (!isHex(privateKey)) {\n console.error(\"Private key found in cache is not valid hex\", { privateKey, cacheKey });\n throw new Error(`Private key found in cache (${cacheKey}) is not valid hex`);\n }\n // ensure we can extract address from private key\n // this should throw on bad private keys\n privateKeyToAccount(privateKey);\n}\n\nexport function getBurnerPrivateKey(cacheKey = \"mud:burnerWallet\"): Hex {\n const cachedPrivateKey = localStorage.getItem(cacheKey);\n\n if (cachedPrivateKey != null) {\n assertPrivateKey(cachedPrivateKey, cacheKey);\n return cachedPrivateKey;\n }\n\n const privateKey = generatePrivateKey();\n console.log(\"New burner wallet created:\", privateKeyToAccount(privateKey));\n localStorage.setItem(cacheKey, privateKey);\n return privateKey;\n}\n","import { Hex } from \"viem\";\n\n/**\n * Get the hex value at start/end positions. This will always return a valid hex string.\n *\n * If `start` is out of range, this returns `\"0x\"`.\n *\n * If `end` is specified and out of range, the result is right zero-padded to the desired length (`end - start`).\n */\nexport function readHex(data: Hex, start: number, end?: number): Hex {\n return `0x${data\n .replace(/^0x/, \"\")\n .slice(start * 2, end != null ? end * 2 : undefined)\n .padEnd(((end ?? start) - start) * 2, \"0\")}`;\n}\n","// Inspired by https://doc.rust-lang.org/std/result/\nexport type Result<Ok, Err = unknown> = { ok: Ok } | { error: Err };\n\nexport function isOk<Ok, Err>(result: Result<Ok, Err>): result is { ok: Ok } {\n return \"ok\" in result;\n}\n\nexport function isError<Ok, Err>(result: Result<Ok, Err>): result is { error: Err } {\n return \"error\" in result;\n}\n\nexport function unwrap<Ok, Err>(result: Result<Ok, Err>): Ok {\n if (isError(result)) {\n throw result.error;\n }\n return result.ok;\n}\n","import { Hex, concatHex } from \"viem\";\nimport { readHex } from \"./readHex\";\n\nexport function spliceHex(data: Hex, start: number, deleteCount = 0, newData: Hex = \"0x\"): Hex {\n return concatHex([readHex(data, 0, start), newData, readHex(data, start + deleteCount)]);\n}\n","import { Hex, Transport, keccak256 } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\n\nconst debug = parentDebug.extend(\"transportObserver\");\n\nexport function transportObserver<TTransport extends Transport>(transport: TTransport): TTransport {\n return ((opts) => {\n const result = transport(opts);\n const request: typeof result.request = async (req) => {\n if (req.method === \"eth_sendRawTransaction\" && req.params instanceof Array) {\n const txs = req.params.map((data: Hex) => keccak256(data));\n debug(\"saw txs\", txs);\n // TODO: pass these tx hashes into dev tools\n }\n // TODO: add support for `eth_sendTransaction`\n return result.request(req);\n };\n return {\n ...result,\n request,\n };\n }) as TTransport;\n}\n","import { getContract } from \"../getContract\";\n\n/** @deprecated use `getContract` instead */\nexport const createContract = getContract;\n","import { resourceToHex } from \"../resourceToHex\";\n\n/** @deprecated use `resourceToHex` instead */\nexport const resourceIdToHex = resourceToHex;\n","import { hexToResource } from \"../hexToResource\";\n\n/** @deprecated use `hexToResource` instead */\nexport const hexToResourceId = hexToResource;\n"],"mappings":"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","names":["createDebug","parentDebug","createBenchmark","namespace","debug","lastStep","stepName","secondsSinceLastStep","privateKeyToAccount","createBurnerAccount","privateKey","viem_getContract","getFunctionParameters","values","hasArgs","args","options","getContract","abi","address","publicClient","walletClient","onWrite","contract","viem_getContract","nextWriteId","_","functionName","parameters","request","result","writeContract","id","generatePrivateKey","privateKeyToAccount","isHex","assertPrivateKey","privateKey","cacheKey","getBurnerPrivateKey","cachedPrivateKey","readHex","data","start","end","isOk","result","isError","unwrap","concatHex","spliceHex","data","start","deleteCount","newData","concatHex","readHex","keccak256","debug","transportObserver","transport","opts","result","req","txs","data","keccak256","createContract","getContract","resourceIdToHex","resourceToHex","hexToResourceId","hexToResource"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@latticexyz/common",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Common low level logic shared between packages",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"prettier": "3.2.5",
|
|
57
57
|
"prettier-plugin-solidity": "1.3.1",
|
|
58
58
|
"viem": "2.7.12",
|
|
59
|
-
"@latticexyz/schema-type": "2.0.
|
|
59
|
+
"@latticexyz/schema-type": "2.0.3"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/debug": "^4.1.7",
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
import type { Transport, Chain, Account, WalletActions,
|
|
1
|
+
import type { Transport, Chain, Account, WalletActions, Client, PublicClient } from "viem";
|
|
2
2
|
import { writeContract as mud_writeContract } from "../writeContract";
|
|
3
3
|
import { sendTransaction as mud_sendTransaction } from "../sendTransaction";
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export type TransactionQueueOptions<chain extends Chain> = {
|
|
6
|
+
publicClient?: PublicClient<Transport, chain>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function transactionQueue<chain extends Chain, account extends Account>({
|
|
10
|
+
publicClient,
|
|
11
|
+
}: TransactionQueueOptions<chain> = {}): (
|
|
12
|
+
client: Client<Transport, chain, account>,
|
|
13
|
+
) => Pick<WalletActions<chain, account>, "writeContract" | "sendTransaction"> {
|
|
8
14
|
return (client) => ({
|
|
9
15
|
// Applies to: `client.writeContract`, `getContract(client, ...).write`
|
|
10
|
-
writeContract: (args) => mud_writeContract(client, args),
|
|
16
|
+
writeContract: (args) => mud_writeContract(client, args, publicClient),
|
|
11
17
|
// Applies to: `client.sendTransaction`
|
|
12
|
-
sendTransaction: (args) => mud_sendTransaction(client, args),
|
|
18
|
+
sendTransaction: (args) => mud_sendTransaction(client, args, publicClient),
|
|
13
19
|
});
|
|
14
20
|
}
|
|
@@ -4,8 +4,8 @@ import type {
|
|
|
4
4
|
Chain,
|
|
5
5
|
Account,
|
|
6
6
|
WalletActions,
|
|
7
|
-
WalletClient,
|
|
8
7
|
WriteContractReturnType,
|
|
8
|
+
Client,
|
|
9
9
|
} from "viem";
|
|
10
10
|
import { getAction } from "viem/utils";
|
|
11
11
|
import { writeContract } from "viem/actions";
|
|
@@ -16,7 +16,7 @@ type WriteObserverParameters = { onWrite: (write: ContractWrite) => void };
|
|
|
16
16
|
export function writeObserver<TChain extends Chain, TAccount extends Account>({
|
|
17
17
|
onWrite,
|
|
18
18
|
}: WriteObserverParameters): (
|
|
19
|
-
client:
|
|
19
|
+
client: Client<Transport, TChain, TAccount>,
|
|
20
20
|
) => Pick<WalletActions<TChain, TAccount>, "writeContract"> {
|
|
21
21
|
let nextWriteId = 0;
|
|
22
22
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Hex, PrivateKeyAccount } from "viem";
|
|
2
2
|
import { privateKeyToAccount } from "viem/accounts";
|
|
3
3
|
|
|
4
|
-
export function createBurnerAccount(privateKey: Hex):
|
|
4
|
+
export function createBurnerAccount(privateKey: Hex): PrivateKeyAccount {
|
|
5
5
|
const account = privateKeyToAccount(privateKey);
|
|
6
6
|
// We may override account features here
|
|
7
7
|
return {
|
package/src/getContract.ts
CHANGED
|
@@ -118,10 +118,14 @@ export function getContract<
|
|
|
118
118
|
TChain,
|
|
119
119
|
TAccount
|
|
120
120
|
>;
|
|
121
|
-
const result = writeContract(walletClient, request);
|
|
121
|
+
const result = writeContract(walletClient, request, publicClient);
|
|
122
122
|
|
|
123
123
|
const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;
|
|
124
|
-
onWrite?.({
|
|
124
|
+
onWrite?.({
|
|
125
|
+
id,
|
|
126
|
+
request: request as WriteContractParameters,
|
|
127
|
+
result,
|
|
128
|
+
});
|
|
125
129
|
|
|
126
130
|
return result;
|
|
127
131
|
};
|
package/src/sendTransaction.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
SendTransactionParameters,
|
|
7
7
|
Transport,
|
|
8
8
|
SendTransactionReturnType,
|
|
9
|
+
PublicClient,
|
|
9
10
|
} from "viem";
|
|
10
11
|
import { call, sendTransaction as viem_sendTransaction } from "viem/actions";
|
|
11
12
|
import pRetry from "p-retry";
|
|
@@ -19,12 +20,13 @@ const debug = parentDebug.extend("sendTransaction");
|
|
|
19
20
|
|
|
20
21
|
/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */
|
|
21
22
|
export async function sendTransaction<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
chain extends Chain | undefined,
|
|
24
|
+
account extends Account | undefined,
|
|
25
|
+
chainOverride extends Chain | undefined,
|
|
25
26
|
>(
|
|
26
|
-
client: Client<Transport,
|
|
27
|
-
request: SendTransactionParameters<
|
|
27
|
+
client: Client<Transport, chain, account>,
|
|
28
|
+
request: SendTransactionParameters<chain, account, chainOverride>,
|
|
29
|
+
publicClient?: PublicClient<Transport, chain>,
|
|
28
30
|
): Promise<SendTransactionReturnType> {
|
|
29
31
|
const rawAccount = request.account ?? client.account;
|
|
30
32
|
if (!rawAccount) {
|
|
@@ -34,23 +36,23 @@ export async function sendTransaction<
|
|
|
34
36
|
const account = parseAccount(rawAccount);
|
|
35
37
|
|
|
36
38
|
const nonceManager = await getNonceManager({
|
|
37
|
-
client,
|
|
39
|
+
client: publicClient ?? client,
|
|
38
40
|
address: account.address,
|
|
39
41
|
blockTag: "pending",
|
|
40
42
|
});
|
|
41
43
|
|
|
42
|
-
async function prepare(): Promise<SendTransactionParameters<
|
|
44
|
+
async function prepare(): Promise<SendTransactionParameters<chain, account, chainOverride>> {
|
|
43
45
|
if (request.gas) {
|
|
44
46
|
debug("gas provided, skipping simulate", request.to);
|
|
45
47
|
return request;
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
debug("simulating tx to", request.to);
|
|
49
|
-
await call(client, {
|
|
51
|
+
await call(publicClient ?? client, {
|
|
50
52
|
...request,
|
|
51
53
|
blockTag: "pending",
|
|
52
54
|
account,
|
|
53
|
-
} as CallParameters<
|
|
55
|
+
} as CallParameters<chain>);
|
|
54
56
|
|
|
55
57
|
return request;
|
|
56
58
|
}
|
|
@@ -67,7 +69,7 @@ export async function sendTransaction<
|
|
|
67
69
|
|
|
68
70
|
const nonce = nonceManager.nextNonce();
|
|
69
71
|
debug("sending tx with nonce", nonce, "to", preparedRequest.to);
|
|
70
|
-
const parameters: SendTransactionParameters<
|
|
72
|
+
const parameters: SendTransactionParameters<chain, account, chainOverride> = { nonce, ...preparedRequest };
|
|
71
73
|
return await viem_sendTransaction(client, parameters);
|
|
72
74
|
},
|
|
73
75
|
{
|
package/src/writeContract.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
WriteContractReturnType,
|
|
10
10
|
ContractFunctionName,
|
|
11
11
|
ContractFunctionArgs,
|
|
12
|
+
PublicClient,
|
|
12
13
|
} from "viem";
|
|
13
14
|
import { simulateContract, writeContract as viem_writeContract } from "viem/actions";
|
|
14
15
|
import pRetry from "p-retry";
|
|
@@ -31,6 +32,7 @@ export async function writeContract<
|
|
|
31
32
|
>(
|
|
32
33
|
client: Client<Transport, chain, account>,
|
|
33
34
|
request: WriteContractParameters<abi, functionName, args, chain, account, chainOverride>,
|
|
35
|
+
publicClient?: PublicClient<Transport, chain>,
|
|
34
36
|
): Promise<WriteContractReturnType> {
|
|
35
37
|
const rawAccount = request.account ?? client.account;
|
|
36
38
|
if (!rawAccount) {
|
|
@@ -40,7 +42,7 @@ export async function writeContract<
|
|
|
40
42
|
const account = parseAccount(rawAccount);
|
|
41
43
|
|
|
42
44
|
const nonceManager = await getNonceManager({
|
|
43
|
-
client,
|
|
45
|
+
client: publicClient ?? client,
|
|
44
46
|
address: account.address,
|
|
45
47
|
blockTag: "pending",
|
|
46
48
|
});
|
|
@@ -54,11 +56,14 @@ export async function writeContract<
|
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
debug("simulating", request.functionName, "at", request.address);
|
|
57
|
-
const result = await simulateContract<chain, account, abi, functionName, args, chainOverride>(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
const result = await simulateContract<chain, account | undefined, abi, functionName, args, chainOverride>(
|
|
60
|
+
publicClient ?? client,
|
|
61
|
+
{
|
|
62
|
+
...request,
|
|
63
|
+
blockTag: "pending",
|
|
64
|
+
account,
|
|
65
|
+
} as unknown as SimulateContractParameters<abi, functionName, args, chain, chainOverride>,
|
|
66
|
+
);
|
|
62
67
|
|
|
63
68
|
return result.request as unknown as WriteContractParameters<abi, functionName, args, chain, account, chainOverride>;
|
|
64
69
|
}
|
|
@@ -75,7 +80,10 @@ export async function writeContract<
|
|
|
75
80
|
|
|
76
81
|
const nonce = nonceManager.nextNonce();
|
|
77
82
|
debug("calling", preparedWrite.functionName, "with nonce", nonce, "at", preparedWrite.address);
|
|
78
|
-
return await viem_writeContract(client, {
|
|
83
|
+
return await viem_writeContract(client, {
|
|
84
|
+
nonce,
|
|
85
|
+
...preparedWrite,
|
|
86
|
+
} as typeof preparedWrite);
|
|
79
87
|
},
|
|
80
88
|
{
|
|
81
89
|
retries: 3,
|
package/dist/chunk-PEY5BGLC.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u}from"./chunk-TCWGPC6G.js";import{getAddress as y}from"viem";import{getChainId as M}from"viem/actions";async function m({client:a,address:n,blockTag:r}){return`mud:createNonceManager:${a.chain?.id??await M(a)}:${y(n)}:${r}`}import{BaseError as P,NonceTooHighError as v,NonceTooLowError as A}from"viem";import{getTransactionCount as O}from"viem/actions";import R from"p-queue";var h=u.extend("createNonceManager");function C({client:a,address:n,blockTag:r="pending",broadcastChannelName:o}){let e={current:-1},c=null;typeof BroadcastChannel<"u"&&(o?Promise.resolve(o):m({client:a,address:n,blockTag:r})).then(d=>{c=new BroadcastChannel(d),c.addEventListener("message",x=>{let N=JSON.parse(x.data);h("got nonce from broadcast channel",N),e.current=N})});function t(){return e.current>=0}function i(){if(!t())throw new Error("call resetNonce before using nextNonce");let s=e.current++;return c?.postMessage(JSON.stringify(e.current)),s}async function l(){let s=await O(a,{address:n,blockTag:r});e.current=s,c?.postMessage(JSON.stringify(e.current)),h("reset nonce to",e.current)}function w(s){return s instanceof P&&s.walk(d=>d instanceof A||d instanceof v)!=null}let b=new R({concurrency:1});return{hasNonce:t,nextNonce:i,resetNonce:l,shouldResetNonce:w,mempoolQueue:b}}var T=new Map;async function g({client:a,address:n,blockTag:r="pending"}){let o=await m({client:a,address:n,blockTag:r}),e=T.get(o);if(e)return e;let c=C({client:a,address:n,blockTag:r});return T.set(o,c),c}import{simulateContract as k,writeContract as S}from"viem/actions";import W from"p-retry";import{parseAccount as B}from"viem/accounts";var p=u.extend("writeContract");async function dn(a,n){let r=n.account??a.account;if(!r)throw new Error("No account provided");let o=B(r),e=await g({client:a,address:o.address,blockTag:"pending"});async function c(){return n.gas?(p("gas provided, skipping simulate",n.functionName,n.address),n):(p("simulating",n.functionName,"at",n.address),(await k(a,{...n,blockTag:"pending",account:o})).request)}return e.mempoolQueue.add(()=>W(async()=>{let t=await c();e.hasNonce()||await e.resetNonce();let i=e.nextNonce();return p("calling",t.functionName,"with nonce",i,"at",t.address),await S(a,{nonce:i,...t})},{retries:3,onFailedAttempt:async t=>{if(e.shouldResetNonce(t)){p("got nonce error, retrying",t.message),await e.resetNonce();return}throw t}}),{throwOnTimeout:!0})}import{call as E,sendTransaction as F}from"viem/actions";import I from"p-retry";import{parseAccount as Q}from"viem/accounts";var f=u.extend("sendTransaction");async function hn(a,n){let r=n.account??a.account;if(!r)throw new Error("No account provided");let o=Q(r),e=await g({client:a,address:o.address,blockTag:"pending"});async function c(){return n.gas?(f("gas provided, skipping simulate",n.to),n):(f("simulating tx to",n.to),await E(a,{...n,blockTag:"pending",account:o}),n)}return await e.mempoolQueue.add(()=>I(async()=>{let t=await c();e.hasNonce()||await e.resetNonce();let i=e.nextNonce();f("sending tx with nonce",i,"to",t.to);let l={nonce:i,...t};return await F(a,l)},{retries:3,onFailedAttempt:async t=>{if(e.shouldResetNonce(t)){f("got nonce error, retrying",t.message),await e.resetNonce();return}throw t}}),{throwOnTimeout:!0})}export{m as a,C as b,g as c,dn as d,hn as e};
|
|
2
|
-
//# sourceMappingURL=chunk-PEY5BGLC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/getNonceManagerId.ts","../src/createNonceManager.ts","../src/getNonceManager.ts","../src/writeContract.ts","../src/sendTransaction.ts"],"sourcesContent":["import { BlockTag, Client, Hex, getAddress } from \"viem\";\nimport { getChainId } from \"viem/actions\";\n\nexport async function getNonceManagerId({\n client,\n address,\n blockTag,\n}: {\n client: Client;\n address: Hex;\n blockTag: BlockTag;\n}): Promise<string> {\n // TODO: improve this so we don't have to call getChainId every time\n const chainId = client.chain?.id ?? (await getChainId(client));\n return `mud:createNonceManager:${chainId}:${getAddress(address)}:${blockTag}`;\n}\n","import { BaseError, BlockTag, Client, Hex, NonceTooHighError, NonceTooLowError } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManagerId } from \"./getNonceManagerId\";\nimport { getTransactionCount } from \"viem/actions\";\nimport PQueue from \"p-queue\";\n\nconst debug = parentDebug.extend(\"createNonceManager\");\n\nexport type CreateNonceManagerOptions = {\n client: Client;\n address: Hex;\n blockTag?: BlockTag;\n broadcastChannelName?: string;\n};\n\nexport type CreateNonceManagerResult = {\n hasNonce: () => boolean;\n nextNonce: () => number;\n resetNonce: () => Promise<void>;\n shouldResetNonce: (error: unknown) => boolean;\n mempoolQueue: PQueue;\n};\n\nexport function createNonceManager({\n client,\n address, // TODO: rename to account?\n blockTag = \"pending\",\n broadcastChannelName,\n}: CreateNonceManagerOptions): CreateNonceManagerResult {\n const nonceRef = { current: -1 };\n let channel: BroadcastChannel | null = null;\n\n if (typeof BroadcastChannel !== \"undefined\") {\n const channelName = broadcastChannelName\n ? Promise.resolve(broadcastChannelName)\n : getNonceManagerId({ client, address, blockTag });\n channelName.then((name) => {\n channel = new BroadcastChannel(name);\n // TODO: emit some sort of \"connected\" event so other channels can broadcast current nonce\n channel.addEventListener(\"message\", (event) => {\n const nonce = JSON.parse(event.data);\n debug(\"got nonce from broadcast channel\", nonce);\n nonceRef.current = nonce;\n });\n });\n }\n\n function hasNonce(): boolean {\n return nonceRef.current >= 0;\n }\n\n function nextNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using nextNonce\");\n const nonce = nonceRef.current++;\n channel?.postMessage(JSON.stringify(nonceRef.current));\n return nonce;\n }\n\n async function resetNonce(): Promise<void> {\n const nonce = await getTransactionCount(client, { address, blockTag });\n nonceRef.current = nonce;\n channel?.postMessage(JSON.stringify(nonceRef.current));\n debug(\"reset nonce to\", nonceRef.current);\n }\n\n function shouldResetNonce(error: unknown): boolean {\n return (\n error instanceof BaseError &&\n error.walk((e) => e instanceof NonceTooLowError || e instanceof NonceTooHighError) != null\n );\n }\n\n const mempoolQueue = new PQueue({ concurrency: 1 });\n\n return {\n hasNonce,\n nextNonce,\n resetNonce,\n shouldResetNonce,\n mempoolQueue,\n };\n}\n","import { CreateNonceManagerOptions, CreateNonceManagerResult, createNonceManager } from \"./createNonceManager\";\nimport { getNonceManagerId } from \"./getNonceManagerId\";\n\nconst nonceManagers = new Map<string, CreateNonceManagerResult>();\n\nexport async function getNonceManager({\n client,\n address, // TODO: rename to account?\n blockTag = \"pending\",\n}: CreateNonceManagerOptions): Promise<CreateNonceManagerResult> {\n const id = await getNonceManagerId({ client, address, blockTag });\n\n const existingNonceManager = nonceManagers.get(id);\n if (existingNonceManager) {\n return existingNonceManager;\n }\n\n const nonceManager = createNonceManager({ client, address, blockTag });\n nonceManagers.set(id, nonceManager);\n return nonceManager;\n}\n","import {\n Abi,\n Account,\n Chain,\n Client,\n SimulateContractParameters,\n Transport,\n WriteContractParameters,\n WriteContractReturnType,\n ContractFunctionName,\n ContractFunctionArgs,\n} from \"viem\";\nimport { simulateContract, writeContract as viem_writeContract } from \"viem/actions\";\nimport pRetry from \"p-retry\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManager } from \"./getNonceManager\";\nimport { parseAccount } from \"viem/accounts\";\n\nconst debug = parentDebug.extend(\"writeContract\");\n\n// TODO: migrate away from this approach once we can hook into viem's nonce management: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function writeContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"nonpayable\" | \"payable\">,\n args extends ContractFunctionArgs<abi, \"nonpayable\" | \"payable\", functionName>,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain, account>,\n request: WriteContractParameters<abi, functionName, args, chain, account, chainOverride>,\n): Promise<WriteContractReturnType> {\n const rawAccount = request.account ?? client.account;\n if (!rawAccount) {\n // TODO: replace with viem AccountNotFoundError once its exported\n throw new Error(\"No account provided\");\n }\n const account = parseAccount(rawAccount);\n\n const nonceManager = await getNonceManager({\n client,\n address: account.address,\n blockTag: \"pending\",\n });\n\n async function prepareWrite(): Promise<\n WriteContractParameters<abi, functionName, args, chain, account, chainOverride>\n > {\n if (request.gas) {\n debug(\"gas provided, skipping simulate\", request.functionName, request.address);\n return request;\n }\n\n debug(\"simulating\", request.functionName, \"at\", request.address);\n const result = await simulateContract<chain, account, abi, functionName, args, chainOverride>(client, {\n ...request,\n blockTag: \"pending\",\n account,\n } as unknown as SimulateContractParameters<abi, functionName, args, chain, chainOverride>);\n\n return result.request as unknown as WriteContractParameters<abi, functionName, args, chain, account, chainOverride>;\n }\n\n return nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const preparedWrite = await prepareWrite();\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n const nonce = nonceManager.nextNonce();\n debug(\"calling\", preparedWrite.functionName, \"with nonce\", nonce, \"at\", preparedWrite.address);\n return await viem_writeContract(client, { nonce, ...preparedWrite } as typeof preparedWrite);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // On nonce errors, reset the nonce and retry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n await nonceManager.resetNonce();\n return;\n }\n // TODO: prepareWrite again if there are gas errors?\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n","import {\n Account,\n CallParameters,\n Chain,\n Client,\n SendTransactionParameters,\n Transport,\n SendTransactionReturnType,\n} from \"viem\";\nimport { call, sendTransaction as viem_sendTransaction } from \"viem/actions\";\nimport pRetry from \"p-retry\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManager } from \"./getNonceManager\";\nimport { parseAccount } from \"viem/accounts\";\n\nconst debug = parentDebug.extend(\"sendTransaction\");\n\n// TODO: migrate away from this approach once we can hook into viem's nonce management: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function sendTransaction<\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n TChainOverride extends Chain | undefined,\n>(\n client: Client<Transport, TChain, TAccount>,\n request: SendTransactionParameters<TChain, TAccount, TChainOverride>,\n): Promise<SendTransactionReturnType> {\n const rawAccount = request.account ?? client.account;\n if (!rawAccount) {\n // TODO: replace with viem AccountNotFoundError once its exported\n throw new Error(\"No account provided\");\n }\n const account = parseAccount(rawAccount);\n\n const nonceManager = await getNonceManager({\n client,\n address: account.address,\n blockTag: \"pending\",\n });\n\n async function prepare(): Promise<SendTransactionParameters<TChain, TAccount, TChainOverride>> {\n if (request.gas) {\n debug(\"gas provided, skipping simulate\", request.to);\n return request;\n }\n\n debug(\"simulating tx to\", request.to);\n await call(client, {\n ...request,\n blockTag: \"pending\",\n account,\n } as CallParameters<TChain>);\n\n return request;\n }\n\n return await nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const preparedRequest = await prepare();\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n const nonce = nonceManager.nextNonce();\n debug(\"sending tx with nonce\", nonce, \"to\", preparedRequest.to);\n const parameters: SendTransactionParameters<TChain, TAccount, TChainOverride> = { nonce, ...preparedRequest };\n return await viem_sendTransaction(client, parameters);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // On nonce errors, reset the nonce and retry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n await nonceManager.resetNonce();\n return;\n }\n // TODO: prepare again if there are gas errors?\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n"],"mappings":"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","names":["getAddress","getChainId","getNonceManagerId","client","address","blockTag","BaseError","NonceTooHighError","NonceTooLowError","getTransactionCount","PQueue","debug","createNonceManager","client","address","blockTag","broadcastChannelName","nonceRef","channel","getNonceManagerId","name","event","nonce","hasNonce","nextNonce","resetNonce","shouldResetNonce","error","BaseError","e","NonceTooLowError","NonceTooHighError","mempoolQueue","nonceManagers","getNonceManager","client","address","blockTag","id","getNonceManagerId","existingNonceManager","nonceManager","createNonceManager","simulateContract","viem_writeContract","pRetry","parseAccount","debug","writeContract","client","request","rawAccount","account","nonceManager","getNonceManager","prepareWrite","simulateContract","pRetry","preparedWrite","nonce","viem_writeContract","error","call","viem_sendTransaction","pRetry","parseAccount","debug","sendTransaction","client","request","rawAccount","account","nonceManager","getNonceManager","prepare","call","pRetry","preparedRequest","nonce","parameters","viem_sendTransaction","error"]}
|