@latticexyz/common 2.2.17-ffefc8f000769d5ca625dd19290007a853a21788 → 2.2.17

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.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-Q7HNDKVJ.js";import{e as a}from"./chunk-GUEDVXKC.js";import"./chunk-TCWGPC6G.js";function d(n={}){return e=>({writeContract:t=>o(e,t,n),sendTransaction:t=>a(e,t,n)})}import{getAction as s}from"viem/utils";import{writeContract as u}from"viem/actions";function f({onWrite:n}){let e=0;return t=>({writeContract:r=>{let i=s(t,u,"writeContract")(r),c=`${t.chain.id}:${t.account.address}:${e++}`;return n({id:c,request:r,result:i}),i}})}export{d as transactionQueue,f as writeObserver};
1
+ import{a as o}from"./chunk-DPUUE7NM.js";import{f as a}from"./chunk-6FIKI2CG.js";import"./chunk-TCWGPC6G.js";function d(n={}){return e=>({writeContract:t=>o(e,t,n),sendTransaction:t=>a(e,t,n)})}import{getAction as s}from"viem/utils";import{writeContract as u}from"viem/actions";function f({onWrite:n}){let e=0;return t=>({writeContract:r=>{let i=s(t,u,"writeContract")(r),c=`${t.chain.id}:${t.account.address}:${e++}`;return n({id:c,request:r,result:i}),i}})}export{d as transactionQueue,f as writeObserver};
2
2
  //# sourceMappingURL=actions.js.map
package/dist/chains.d.ts CHANGED
@@ -665,7 +665,7 @@ declare const rhodolite: {
665
665
  readonly name: "Rhodolite Devnet";
666
666
  readonly testnet: true;
667
667
  readonly id: 17420;
668
- readonly sourceId: 17001;
668
+ readonly sourceId: 17000;
669
669
  readonly nativeCurrency: {
670
670
  readonly name: "Ether";
671
671
  readonly symbol: "ETH";
@@ -690,9 +690,13 @@ declare const rhodolite: {
690
690
  };
691
691
  };
692
692
  readonly contracts: {
693
+ readonly l1StandardBridge: {
694
+ readonly 17000: {
695
+ readonly address: "0x6487446e0B9FAEa90F6a9772A6448cFa780E30F9";
696
+ };
697
+ };
693
698
  readonly quarryPaymaster: {
694
- readonly address: "0x61f22c3827d90c390e0e2aaf220971524ac0a68d";
695
- readonly blockCreated: 11262;
699
+ readonly address: "0x7ca1b85aca23fccf2fbac14c02b5e8a6432639b9";
696
700
  };
697
701
  readonly gasPriceOracle: {
698
702
  readonly address: "0x420000000000000000000000000000000000000F";
package/dist/chains.js CHANGED
@@ -1,2 +1,2 @@
1
- import{foundry as o}from"viem/chains";var t={...o,fees:{defaultPriorityFee:0n}};import{redstone as s}from"viem/chains";var n={...s,iconUrls:["https://redstone.xyz/chain-icons/redstone.png"],indexerUrl:"https://indexer.mud.redstonechain.com"};import{garnet as i}from"viem/chains";var a={...i,iconUrls:["https://redstone.xyz/chain-icons/garnet.png"],indexerUrl:"https://indexer.mud.garnetchain.com"};import{chainConfig as e}from"viem/op-stack";var c=17001,r={http:["https://rpc.rhodolitechain.com"],webSocket:["wss://rpc.rhodolitechain.com"]},d={...e,name:"Rhodolite Devnet",testnet:!0,id:17420,sourceId:c,nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:r,bundler:r,quarryPassIssuer:r,wiresaw:r},contracts:{...e.contracts,quarryPaymaster:{address:"0x61f22c3827d90c390e0e2aaf220971524ac0a68d",blockCreated:11262}},blockExplorers:{default:{name:"Blockscout",url:"https://explorer.rhodolitechain.com"},worldsExplorer:{name:"MUD Worlds Explorer",url:"https://explorer.mud.dev/rhodolite/worlds"}},iconUrls:["https://redstone.xyz/chain-icons/rhodolite.png"],indexerUrl:"https://indexer.mud.rhodolitechain.com"};export{a as garnet,t as mudFoundry,n as redstone,d as rhodolite};
1
+ import{foundry as t}from"viem/chains";var s={...t,fees:{defaultPriorityFee:0n}};import{redstone as n}from"viem/chains";var i={...n,iconUrls:["https://redstone.xyz/chain-icons/redstone.png"],indexerUrl:"https://indexer.mud.redstonechain.com"};import{garnet as a}from"viem/chains";var c={...a,iconUrls:["https://redstone.xyz/chain-icons/garnet.png"],indexerUrl:"https://indexer.mud.garnetchain.com"};import{chainConfig as e}from"viem/op-stack";var o=17e3,r={http:["https://rpc.rhodolitechain.com"],webSocket:["wss://rpc.rhodolitechain.com"]},d={...e,name:"Rhodolite Devnet",testnet:!0,id:17420,sourceId:o,nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:r,bundler:r,quarryPassIssuer:r,wiresaw:r},contracts:{...e.contracts,l1StandardBridge:{[o]:{address:"0x6487446e0B9FAEa90F6a9772A6448cFa780E30F9"}},quarryPaymaster:{address:"0x7ca1b85aca23fccf2fbac14c02b5e8a6432639b9"}},blockExplorers:{default:{name:"Blockscout",url:"https://explorer.rhodolitechain.com"},worldsExplorer:{name:"MUD Worlds Explorer",url:"https://explorer.mud.dev/rhodolite/worlds"}},iconUrls:["https://redstone.xyz/chain-icons/rhodolite.png"],indexerUrl:"https://indexer.mud.rhodolitechain.com"};export{c as garnet,s as mudFoundry,i as redstone,d as rhodolite};
2
2
  //# sourceMappingURL=chains.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chains/mudFoundry.ts","../src/chains/redstone.ts","../src/chains/garnet.ts","../src/chains/rhodolite.ts"],"sourcesContent":["import { foundry } from \"viem/chains\";\nimport { MUDChain } from \"./types\";\n\nexport const mudFoundry = {\n ...foundry,\n fees: {\n defaultPriorityFee: 0n,\n },\n} as const satisfies MUDChain;\n","import { redstone as redstoneConfig } from \"viem/chains\";\nimport type { MUDChain } from \"./types\";\n\nexport const redstone = {\n ...redstoneConfig,\n iconUrls: [\"https://redstone.xyz/chain-icons/redstone.png\"],\n indexerUrl: \"https://indexer.mud.redstonechain.com\",\n} as const satisfies MUDChain;\n","import { garnet as garnetConfig } from \"viem/chains\";\nimport type { MUDChain } from \"./types\";\n\nexport const garnet = {\n ...garnetConfig,\n iconUrls: [\"https://redstone.xyz/chain-icons/garnet.png\"],\n indexerUrl: \"https://indexer.mud.garnetchain.com\",\n} as const satisfies MUDChain;\n","import { chainConfig } from \"viem/op-stack\";\nimport { MUDChain } from \"./types\";\nimport { Chain } from \"viem\";\n\nconst sourceId = 17001;\n\nconst defaultRpcUrls = {\n http: [\"https://rpc.rhodolitechain.com\"],\n webSocket: [\"wss://rpc.rhodolitechain.com\"],\n} as const satisfies Chain[\"rpcUrls\"][\"default\"];\n\nexport const rhodolite = {\n ...chainConfig,\n name: \"Rhodolite Devnet\",\n testnet: true,\n id: 17420,\n sourceId,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: defaultRpcUrls,\n bundler: defaultRpcUrls,\n quarryPassIssuer: defaultRpcUrls,\n wiresaw: defaultRpcUrls,\n },\n contracts: {\n ...chainConfig.contracts,\n quarryPaymaster: {\n address: \"0x61f22c3827d90c390e0e2aaf220971524ac0a68d\",\n blockCreated: 11262,\n },\n },\n blockExplorers: {\n default: {\n name: \"Blockscout\",\n url: \"https://explorer.rhodolitechain.com\",\n },\n worldsExplorer: {\n name: \"MUD Worlds Explorer\",\n url: \"https://explorer.mud.dev/rhodolite/worlds\",\n },\n },\n iconUrls: [\"https://redstone.xyz/chain-icons/rhodolite.png\"],\n indexerUrl: \"https://indexer.mud.rhodolitechain.com\",\n} as const satisfies MUDChain;\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,cAGjB,IAAMC,EAAa,CACxB,GAAGD,EACH,KAAM,CACJ,mBAAoB,EACtB,CACF,ECRA,OAAS,YAAYE,MAAsB,cAGpC,IAAMC,EAAW,CACtB,GAAGD,EACH,SAAU,CAAC,+CAA+C,EAC1D,WAAY,uCACd,ECPA,OAAS,UAAUE,MAAoB,cAGhC,IAAMC,EAAS,CACpB,GAAGD,EACH,SAAU,CAAC,6CAA6C,EACxD,WAAY,qCACd,ECPA,OAAS,eAAAE,MAAmB,gBAI5B,IAAMC,EAAW,MAEXC,EAAiB,CACrB,KAAM,CAAC,gCAAgC,EACvC,UAAW,CAAC,8BAA8B,CAC5C,EAEaC,EAAY,CACvB,GAAGH,EACH,KAAM,mBACN,QAAS,GACT,GAAI,MACJ,SAAAC,EACA,eAAgB,CAAE,KAAM,QAAS,OAAQ,MAAO,SAAU,EAAG,EAC7D,QAAS,CACP,QAASC,EACT,QAASA,EACT,iBAAkBA,EAClB,QAASA,CACX,EACA,UAAW,CACT,GAAGF,EAAY,UACf,gBAAiB,CACf,QAAS,6CACT,aAAc,KAChB,CACF,EACA,eAAgB,CACd,QAAS,CACP,KAAM,aACN,IAAK,qCACP,EACA,eAAgB,CACd,KAAM,sBACN,IAAK,2CACP,CACF,EACA,SAAU,CAAC,gDAAgD,EAC3D,WAAY,wCACd","names":["foundry","mudFoundry","redstoneConfig","redstone","garnetConfig","garnet","chainConfig","sourceId","defaultRpcUrls","rhodolite"]}
1
+ {"version":3,"sources":["../src/chains/mudFoundry.ts","../src/chains/redstone.ts","../src/chains/garnet.ts","../src/chains/rhodolite.ts"],"sourcesContent":["import { foundry } from \"viem/chains\";\nimport { MUDChain } from \"./types\";\n\nexport const mudFoundry = {\n ...foundry,\n fees: {\n defaultPriorityFee: 0n,\n },\n} as const satisfies MUDChain;\n","import { redstone as redstoneConfig } from \"viem/chains\";\nimport type { MUDChain } from \"./types\";\n\nexport const redstone = {\n ...redstoneConfig,\n iconUrls: [\"https://redstone.xyz/chain-icons/redstone.png\"],\n indexerUrl: \"https://indexer.mud.redstonechain.com\",\n} as const satisfies MUDChain;\n","import { garnet as garnetConfig } from \"viem/chains\";\nimport type { MUDChain } from \"./types\";\n\nexport const garnet = {\n ...garnetConfig,\n iconUrls: [\"https://redstone.xyz/chain-icons/garnet.png\"],\n indexerUrl: \"https://indexer.mud.garnetchain.com\",\n} as const satisfies MUDChain;\n","import { chainConfig } from \"viem/op-stack\";\nimport { MUDChain } from \"./types\";\nimport { Chain } from \"viem\";\n\nconst sourceId = 17000;\n\nconst defaultRpcUrls = {\n http: [\"https://rpc.rhodolitechain.com\"],\n webSocket: [\"wss://rpc.rhodolitechain.com\"],\n} as const satisfies Chain[\"rpcUrls\"][\"default\"];\n\nexport const rhodolite = {\n ...chainConfig,\n name: \"Rhodolite Devnet\",\n testnet: true,\n id: 17420,\n sourceId,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: defaultRpcUrls,\n bundler: defaultRpcUrls,\n quarryPassIssuer: defaultRpcUrls,\n wiresaw: defaultRpcUrls,\n },\n contracts: {\n ...chainConfig.contracts,\n l1StandardBridge: {\n [sourceId]: {\n address: \"0x6487446e0B9FAEa90F6a9772A6448cFa780E30F9\",\n },\n },\n quarryPaymaster: {\n address: \"0x7ca1b85aca23fccf2fbac14c02b5e8a6432639b9\",\n },\n },\n blockExplorers: {\n default: {\n name: \"Blockscout\",\n url: \"https://explorer.rhodolitechain.com\",\n },\n worldsExplorer: {\n name: \"MUD Worlds Explorer\",\n url: \"https://explorer.mud.dev/rhodolite/worlds\",\n },\n },\n iconUrls: [\"https://redstone.xyz/chain-icons/rhodolite.png\"],\n indexerUrl: \"https://indexer.mud.rhodolitechain.com\",\n} as const satisfies MUDChain;\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,cAGjB,IAAMC,EAAa,CACxB,GAAGD,EACH,KAAM,CACJ,mBAAoB,EACtB,CACF,ECRA,OAAS,YAAYE,MAAsB,cAGpC,IAAMC,EAAW,CACtB,GAAGD,EACH,SAAU,CAAC,+CAA+C,EAC1D,WAAY,uCACd,ECPA,OAAS,UAAUE,MAAoB,cAGhC,IAAMC,EAAS,CACpB,GAAGD,EACH,SAAU,CAAC,6CAA6C,EACxD,WAAY,qCACd,ECPA,OAAS,eAAAE,MAAmB,gBAI5B,IAAMC,EAAW,KAEXC,EAAiB,CACrB,KAAM,CAAC,gCAAgC,EACvC,UAAW,CAAC,8BAA8B,CAC5C,EAEaC,EAAY,CACvB,GAAGH,EACH,KAAM,mBACN,QAAS,GACT,GAAI,MACJ,SAAAC,EACA,eAAgB,CAAE,KAAM,QAAS,OAAQ,MAAO,SAAU,EAAG,EAC7D,QAAS,CACP,QAASC,EACT,QAASA,EACT,iBAAkBA,EAClB,QAASA,CACX,EACA,UAAW,CACT,GAAGF,EAAY,UACf,iBAAkB,CAChB,CAACC,CAAQ,EAAG,CACV,QAAS,4CACX,CACF,EACA,gBAAiB,CACf,QAAS,4CACX,CACF,EACA,eAAgB,CACd,QAAS,CACP,KAAM,aACN,IAAK,qCACP,EACA,eAAgB,CACd,KAAM,sBACN,IAAK,2CACP,CACF,EACA,SAAU,CAAC,gDAAgD,EAC3D,WAAY,wCACd","names":["foundry","mudFoundry","redstoneConfig","redstone","garnetConfig","garnet","chainConfig","sourceId","defaultRpcUrls","rhodolite"]}
@@ -0,0 +1,2 @@
1
+ import{a as d}from"./chunk-TCWGPC6G.js";import{getAddress as E}from"viem";import{getChainId as O}from"viem/actions";import{getAction as v}from"viem/utils";async function f({client:e,address:n,blockTag:r}){return`mud:createNonceManager:${e.chain?.id??await v(e,O,"getChainId")({})}:${E(n)}:${r}`}function l(e,n){return n?.(e)?e:e.cause instanceof Error?l(e.cause,n):n?null:e}import{getTransactionCount as I}from"viem/actions";import S from"p-queue";import{getAction as A}from"viem/utils";var R=d.extend("createNonceManager");function T({client:e,address:n,blockTag:r="latest",broadcastChannelName:o,queueConcurrency:a=1}){let t={nonce:-1,noncePromise:null},i=null;typeof BroadcastChannel<"u"&&(o?Promise.resolve(o):f({client:e,address:n,blockTag:r})).then(N=>{i=new BroadcastChannel(N),i.addEventListener("message",m=>{let C=JSON.parse(m.data);R("got nonce from broadcast channel",C),t.nonce=C})});function s(){return t.nonce>=0}function c(){if(!s())throw new Error("call resetNonce before using getNonce");return t.nonce}function g(){if(!s())throw new Error("call resetNonce before using nextNonce");let u=t.nonce++;return i?.postMessage(JSON.stringify(t.nonce)),u}async function b(){t.noncePromise??=(async()=>{t.nonce=await A(e,I,"getTransactionCount")({address:n,blockTag:r}),t.noncePromise=null,i?.postMessage(JSON.stringify(t.nonce)),R("reset nonce to",t.nonce)})(),await t.noncePromise}function M(u){return l(u,({name:m})=>m==="NonceTooLowError"||m==="NonceTooHighError")!=null}let F=new S({concurrency:a});return{hasNonce:s,getNonce:c,nextNonce:g,resetNonce:b,shouldResetNonce:M,mempoolQueue:F}}var h=new Map;async function x({client:e,address:n,blockTag:r="latest",...o}){let a=await f({client:e,address:n,blockTag:r}),t=h.get(a)??T({client:e,address:n,blockTag:r,...o});return h.has(a)||h.set(a,t),t.hasNonce()||await t.resetNonce(),t}import{sendTransaction as H}from"viem/actions";import Q from"p-retry";import{parseAccount as D}from"viem/accounts";import{getChainId as G}from"viem/actions";import{estimateFeesPerGas as q}from"viem/actions";import{getAction as B}from"viem/utils";async function w({client:e,args:n,refreshInterval:r}){let o={fees:{},lastUpdatedTimestamp:0};async function a(){let t=await B(e,q,"estimateFeesPerGas")(n);o.fees=t,o.lastUpdatedTimestamp=Date.now()}return setInterval(a,r),await a(),o}import{getAction as k}from"viem/utils";var y=new Map;async function P(e){let n=e.args?.chain?.id??e.client.chain?.id??await k(e.client,G,"getChainId")({}),r=y.get(n);if(r)return r;let o=await w(e);return y.set(n,o),o}import{getAction as J}from"viem/utils";var p=d.extend("sendTransaction");async function Pe(e,n,r={}){let o=n.account??e.account;if(!o)throw new Error("No account provided");let a=D(o),t=e.chain,i=await x({client:r.publicClient??e,address:a.address,queueConcurrency:r.queueConcurrency}),s=await P({client:r.publicClient??e,refreshInterval:1e4,args:{chain:t}});return await i.mempoolQueue.add(()=>Q(async()=>{let c=i.nextNonce(),g={blockTag:"pending",...s.fees,...n,nonce:c};return p("sending tx to",n.to,"with nonce",c),await J(e,H,"sendTransaction")(g)},{retries:3,onFailedAttempt:async c=>{if(p("failed, resetting nonce"),await i.resetNonce(),i.shouldResetNonce(c)){p("got nonce error, retrying",c.message);return}if(String(c).includes("transaction underpriced")){p("got transaction underpriced error, retrying",c.message);return}throw c}}),{throwOnTimeout:!0})}export{f as a,l as b,T as c,x as d,P as e,Pe as f};
2
+ //# sourceMappingURL=chunk-6FIKI2CG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/getNonceManagerId.ts","../src/findCause.ts","../src/createNonceManager.ts","../src/getNonceManager.ts","../src/sendTransaction.ts","../src/getFeeRef.ts","../src/createFeeRef.ts"],"sourcesContent":["import { BlockTag, Client, Hex, getAddress } from \"viem\";\nimport { getChainId } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\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 getAction(client, getChainId, \"getChainId\")({}));\n return `mud:createNonceManager:${chainId}:${getAddress(address)}:${blockTag}`;\n}\n","export function findCause(error: Error, fn?: (error: Error) => boolean): Error | null {\n if (fn?.(error)) return error;\n if (error.cause instanceof Error) return findCause(error.cause, fn);\n return fn ? null : error;\n}\n","import { BlockTag, Client, Hex } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\nimport { getNonceManagerId } from \"./getNonceManagerId\";\nimport { getTransactionCount } from \"viem/actions\";\nimport PQueue from \"p-queue\";\nimport { getAction } from \"viem/utils\";\nimport { findCause } from \"./findCause\";\n\nconst debug = parentDebug.extend(\"createNonceManager\");\n\nexport type CreateNonceManagerOptions = {\n client: Client;\n address: Hex;\n blockTag?: BlockTag;\n broadcastChannelName?: string;\n queueConcurrency?: number;\n};\n\nexport type CreateNonceManagerResult = {\n hasNonce: () => boolean;\n getNonce: () => number;\n nextNonce: () => number;\n resetNonce: () => Promise<void>;\n shouldResetNonce: (error: Error) => boolean;\n mempoolQueue: PQueue;\n};\n\nexport function createNonceManager({\n client,\n address, // TODO: rename to account?\n blockTag = \"latest\",\n broadcastChannelName,\n queueConcurrency = 1,\n}: CreateNonceManagerOptions): CreateNonceManagerResult {\n const ref = { nonce: -1, noncePromise: null as Promise<void> | null };\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 ref.nonce = nonce;\n });\n });\n }\n\n function hasNonce(): boolean {\n return ref.nonce >= 0;\n }\n\n function getNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using getNonce\");\n return ref.nonce;\n }\n\n function nextNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using nextNonce\");\n const nonce = ref.nonce++;\n channel?.postMessage(JSON.stringify(ref.nonce));\n return nonce;\n }\n\n async function resetNonce(): Promise<void> {\n ref.noncePromise ??= (async (): Promise<void> => {\n ref.nonce = await getAction(client, getTransactionCount, \"getTransactionCount\")({ address, blockTag });\n ref.noncePromise = null;\n channel?.postMessage(JSON.stringify(ref.nonce));\n debug(\"reset nonce to\", ref.nonce);\n })();\n await ref.noncePromise;\n }\n\n function shouldResetNonce(error: Error): boolean {\n const nonceError = findCause(error, ({ name }) => name === \"NonceTooLowError\" || name === \"NonceTooHighError\");\n return nonceError != null;\n }\n\n const mempoolQueue = new PQueue({ concurrency: queueConcurrency });\n\n return {\n hasNonce,\n getNonce,\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 = \"latest\",\n ...opts\n}: CreateNonceManagerOptions): Promise<CreateNonceManagerResult> {\n const id = await getNonceManagerId({ client, address, blockTag });\n\n const nonceManager = nonceManagers.get(id) ?? createNonceManager({ client, address, blockTag, ...opts });\n if (!nonceManagers.has(id)) {\n nonceManagers.set(id, nonceManager);\n }\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n return nonceManager;\n}\n","import {\n Account,\n Chain,\n Client,\n SendTransactionParameters,\n Transport,\n SendTransactionReturnType,\n SendTransactionRequest,\n} from \"viem\";\nimport { 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\";\nimport { getFeeRef } from \"./getFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst debug = parentDebug.extend(\"sendTransaction\");\n\nexport type SendTransactionExtraOptions<chain extends Chain | undefined> = {\n /**\n * `publicClient` can be provided to be used in place of the extended viem client for making public action calls\n * (`getChainId`, `getTransactionCount`, `call`). This helps in cases where the extended\n * viem client is a smart account client, like in [permissionless.js](https://github.com/pimlicolabs/permissionless.js),\n * where the transport is the bundler, not an RPC.\n */\n publicClient?: Client<Transport, chain>;\n /**\n * Adjust the number of concurrent calls to the mempool. This defaults to `1` to ensure transactions are ordered\n * and nonces are handled properly. Any number greater than that is likely to see nonce errors and/or transactions\n * arriving out of order, but this may be an acceptable trade-off for some applications that can safely retry.\n * @default 1\n */\n queueConcurrency?: number;\n};\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function sendTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends SendTransactionRequest<chain, chainOverride>,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n request: SendTransactionParameters<chain, account, chainOverride, request>,\n opts: SendTransactionExtraOptions<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 const chain = client.chain;\n\n const nonceManager = await getNonceManager({\n client: opts.publicClient ?? client,\n address: account.address,\n queueConcurrency: opts.queueConcurrency,\n });\n\n const feeRef = await getFeeRef({\n client: opts.publicClient ?? client,\n refreshInterval: 10000,\n args: { chain },\n });\n\n return await nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const nonce = nonceManager.nextNonce();\n const params = {\n // viem_sendTransaction internally estimates gas, which we want to happen on the pending block\n blockTag: \"pending\",\n ...feeRef.fees,\n ...request,\n nonce,\n } as const satisfies SendTransactionParameters<chain, account, chainOverride, request>;\n debug(\"sending tx to\", request.to, \"with nonce\", nonce);\n return await getAction(client, viem_sendTransaction, \"sendTransaction\")(params as never);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // in case this tx failed before hitting the mempool (i.e. gas estimation error), reset nonce so we don't skip past the unused nonce\n debug(\"failed, resetting nonce\");\n await nonceManager.resetNonce();\n // retry nonce errors\n // TODO: upgrade p-retry and move this to shouldRetry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n return;\n }\n\n if (String(error).includes(\"transaction underpriced\")) {\n debug(\"got transaction underpriced error, retrying\", error.message);\n return;\n }\n\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n","import { getChainId } from \"viem/actions\";\nimport { CreateFeeRefOptions, FeeRef, createFeeRef } from \"./createFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst feeRefs = new Map<number, FeeRef>();\n\nexport async function getFeeRef(opts: CreateFeeRefOptions): Promise<FeeRef> {\n const chainId =\n opts.args?.chain?.id ?? opts.client.chain?.id ?? (await getAction(opts.client, getChainId, \"getChainId\")({}));\n\n const existingFeeRef = feeRefs.get(chainId);\n if (existingFeeRef) {\n return existingFeeRef;\n }\n\n const feeRef = await createFeeRef(opts);\n feeRefs.set(chainId, feeRef);\n return feeRef;\n}\n","import { EstimateFeesPerGasParameters, Client, EstimateFeesPerGasReturnType } from \"viem\";\nimport { estimateFeesPerGas } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\nexport type CreateFeeRefOptions = {\n client: Client;\n refreshInterval: number;\n args?: EstimateFeesPerGasParameters;\n};\n\nexport type FeeRef = {\n fees: EstimateFeesPerGasReturnType | {};\n lastUpdatedTimestamp: number;\n};\n\n/** Update fee values once every `refreshInterval` instead of right before every request */\nexport async function createFeeRef({ client, args, refreshInterval }: CreateFeeRefOptions): Promise<FeeRef> {\n const feeRef: FeeRef = { fees: {}, lastUpdatedTimestamp: 0 };\n\n async function updateFees(): Promise<void> {\n const fees = await getAction(client, estimateFeesPerGas, \"estimateFeesPerGas\")(args);\n feeRef.fees = fees;\n feeRef.lastUpdatedTimestamp = Date.now();\n }\n\n setInterval(updateFees, refreshInterval);\n await updateFees();\n\n return feeRef;\n}\n"],"mappings":"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","names":["getAddress","getChainId","getAction","getNonceManagerId","client","address","blockTag","findCause","error","fn","getTransactionCount","PQueue","getAction","debug","createNonceManager","client","address","blockTag","broadcastChannelName","queueConcurrency","ref","channel","getNonceManagerId","name","event","nonce","hasNonce","getNonce","nextNonce","resetNonce","getAction","getTransactionCount","shouldResetNonce","error","findCause","mempoolQueue","PQueue","nonceManagers","getNonceManager","client","address","blockTag","opts","id","getNonceManagerId","nonceManager","createNonceManager","viem_sendTransaction","pRetry","parseAccount","getChainId","estimateFeesPerGas","getAction","createFeeRef","client","args","refreshInterval","feeRef","updateFees","fees","getAction","feeRefs","getFeeRef","opts","chainId","getChainId","existingFeeRef","feeRef","createFeeRef","getAction","debug","sendTransaction","client","request","opts","rawAccount","account","parseAccount","chain","nonceManager","getNonceManager","feeRef","getFeeRef","pRetry","nonce","params","viem_sendTransaction","error"]}
@@ -0,0 +1,2 @@
1
+ import{d as u,e as d}from"./chunk-6FIKI2CG.js";import{a as s}from"./chunk-TCWGPC6G.js";import{writeContract as f}from"viem/actions";import g from"p-retry";import{parseAccount as h}from"viem/accounts";import{getAction as l}from"viem/utils";var r=s.extend("writeContract");async function T(e,c,a={}){let i=c.account??e.account;if(!i)throw new Error("No account provided");let m=h(i),p=e.chain,t=await u({client:a.publicClient??e,address:m.address,queueConcurrency:a.queueConcurrency}),C=await d({client:a.publicClient??e,refreshInterval:1e4,args:{chain:p}});return t.mempoolQueue.add(()=>g(async()=>{let n=t.nextNonce(),o={blockTag:"pending",...C.fees,...c,nonce:n};return r("calling",o.functionName,"at",o.address,"with nonce",n),await l(e,f,"writeContract")(o)},{retries:3,onFailedAttempt:async n=>{if(r("failed, resetting nonce"),await t.resetNonce(),t.shouldResetNonce(n)){r("got nonce error, retrying",n.message);return}if(String(n).includes("transaction underpriced")){r("got transaction underpriced error, retrying",n.message);return}throw n}}),{throwOnTimeout:!0})}export{T as a};
2
+ //# sourceMappingURL=chunk-DPUUE7NM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/writeContract.ts"],"sourcesContent":["import {\n Abi,\n Account,\n Chain,\n Client,\n Transport,\n WriteContractParameters,\n WriteContractReturnType,\n ContractFunctionName,\n ContractFunctionArgs,\n} from \"viem\";\nimport { 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\";\nimport { getFeeRef } from \"./getFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst debug = parentDebug.extend(\"writeContract\");\n\nexport type WriteContractExtraOptions<chain extends Chain | undefined> = {\n /**\n * `publicClient` can be provided to be used in place of the extended viem client for making public action calls\n * (`getChainId`, `getTransactionCount`, `simulateContract`). This helps in cases where the extended\n * viem client is a smart account client, like in [permissionless.js](https://github.com/pimlicolabs/permissionless.js),\n * where the transport is the bundler, not an RPC.\n */\n publicClient?: Client<Transport, chain>;\n /**\n * Adjust the number of concurrent calls to the mempool. This defaults to `1` to ensure transactions are ordered\n * and nonces are handled properly. Any number greater than that is likely to see nonce errors and/or transactions\n * arriving out of order, but this may be an acceptable trade-off for some applications that can safely retry.\n * @default 1\n */\n queueConcurrency?: number;\n};\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function writeContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const 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 opts: WriteContractExtraOptions<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 const chain = client.chain;\n\n const nonceManager = await getNonceManager({\n client: opts.publicClient ?? client,\n address: account.address,\n queueConcurrency: opts.queueConcurrency,\n });\n\n const feeRef = await getFeeRef({\n client: opts.publicClient ?? client,\n refreshInterval: 10000,\n args: { chain },\n });\n\n return nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const nonce = nonceManager.nextNonce();\n const params = {\n // viem_writeContract internally estimates gas, which we want to happen on the pending block\n blockTag: \"pending\",\n ...feeRef.fees,\n ...request,\n nonce,\n } as const satisfies WriteContractParameters<abi, functionName, args, chain, account, chainOverride>;\n debug(\"calling\", params.functionName, \"at\", params.address, \"with nonce\", nonce);\n return await getAction(client, viem_writeContract, \"writeContract\")(params as never);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // in case this tx failed before hitting the mempool (i.e. gas estimation error), reset nonce so we don't skip past the unused nonce\n debug(\"failed, resetting nonce\");\n await nonceManager.resetNonce();\n // retry nonce errors\n // TODO: upgrade p-retry and move this to shouldRetry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n return;\n }\n\n if (String(error).includes(\"transaction underpriced\")) {\n debug(\"got transaction underpriced error, retrying\", error.message);\n return;\n }\n\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n"],"mappings":"kFAWA,OAAS,iBAAiBA,MAA0B,eACpD,OAAOC,MAAY,UAGnB,OAAS,gBAAAC,MAAoB,gBAE7B,OAAS,aAAAC,MAAiB,aAE1B,IAAMC,EAAQA,EAAY,OAAO,eAAe,EAoBhD,eAAsBC,EAQpBC,EACAC,EACAC,EAAyC,CAAC,EACR,CAClC,IAAMC,EAAaF,EAAQ,SAAWD,EAAO,QAC7C,GAAI,CAACG,EAEH,MAAM,IAAI,MAAM,qBAAqB,EAEvC,IAAMC,EAAUC,EAAaF,CAAU,EACjCG,EAAQN,EAAO,MAEfO,EAAe,MAAMC,EAAgB,CACzC,OAAQN,EAAK,cAAgBF,EAC7B,QAASI,EAAQ,QACjB,iBAAkBF,EAAK,gBACzB,CAAC,EAEKO,EAAS,MAAMC,EAAU,CAC7B,OAAQR,EAAK,cAAgBF,EAC7B,gBAAiB,IACjB,KAAM,CAAE,MAAAM,CAAM,CAChB,CAAC,EAED,OAAOC,EAAa,aAAa,IAC/B,IACEI,EACE,SAAY,CACV,IAAMC,EAAQL,EAAa,UAAU,EAC/BM,EAAS,CAEb,SAAU,UACV,GAAGJ,EAAO,KACV,GAAGR,EACH,MAAAW,CACF,EACA,OAAAd,EAAM,UAAWe,EAAO,aAAc,KAAMA,EAAO,QAAS,aAAcD,CAAK,EACxE,MAAMf,EAAUG,EAAQc,EAAoB,eAAe,EAAED,CAAe,CACrF,EACA,CACE,QAAS,EACT,gBAAiB,MAAOE,GAAU,CAMhC,GAJAjB,EAAM,yBAAyB,EAC/B,MAAMS,EAAa,WAAW,EAG1BA,EAAa,iBAAiBQ,CAAK,EAAG,CACxCjB,EAAM,4BAA6BiB,EAAM,OAAO,EAChD,MACF,CAEA,GAAI,OAAOA,CAAK,EAAE,SAAS,yBAAyB,EAAG,CACrDjB,EAAM,8CAA+CiB,EAAM,OAAO,EAClE,MACF,CAEA,MAAMA,CACR,CACF,CACF,EACF,CAAE,eAAgB,EAAK,CACzB,CACF","names":["viem_writeContract","pRetry","parseAccount","getAction","debug","writeContract","client","request","opts","rawAccount","account","parseAccount","chain","nonceManager","getNonceManager","feeRef","getFeeRef","pRetry","nonce","params","viem_writeContract","error"]}
1
+ {"version":3,"sources":["../src/writeContract.ts"],"sourcesContent":["import {\n Abi,\n Account,\n Chain,\n Client,\n Transport,\n WriteContractParameters,\n WriteContractReturnType,\n ContractFunctionName,\n ContractFunctionArgs,\n} from \"viem\";\nimport { 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\";\nimport { getFeeRef } from \"./getFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst debug = parentDebug.extend(\"writeContract\");\n\nexport type WriteContractExtraOptions<chain extends Chain | undefined> = {\n /**\n * `publicClient` can be provided to be used in place of the extended viem client for making public action calls\n * (`getChainId`, `getTransactionCount`, `simulateContract`). This helps in cases where the extended\n * viem client is a smart account client, like in [permissionless.js](https://github.com/pimlicolabs/permissionless.js),\n * where the transport is the bundler, not an RPC.\n */\n publicClient?: Client<Transport, chain>;\n /**\n * Adjust the number of concurrent calls to the mempool. This defaults to `1` to ensure transactions are ordered\n * and nonces are handled properly. Any number greater than that is likely to see nonce errors and/or transactions\n * arriving out of order, but this may be an acceptable trade-off for some applications that can safely retry.\n * @default 1\n */\n queueConcurrency?: number;\n};\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function writeContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const 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 opts: WriteContractExtraOptions<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 const chain = client.chain;\n\n const nonceManager = await getNonceManager({\n client: opts.publicClient ?? client,\n address: account.address,\n queueConcurrency: opts.queueConcurrency,\n });\n\n const feeRef = await getFeeRef({\n client: opts.publicClient ?? client,\n refreshInterval: 10000,\n args: { chain },\n });\n\n return nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const nonce = nonceManager.nextNonce();\n const params = {\n // viem_writeContract internally estimates gas, which we want to happen on the pending block\n blockTag: \"pending\",\n ...feeRef.fees,\n ...request,\n nonce,\n } as const satisfies WriteContractParameters<abi, functionName, args, chain, account, chainOverride>;\n debug(\"calling\", params.functionName, \"at\", params.address, \"with nonce\", nonce);\n return await getAction(client, viem_writeContract, \"writeContract\")(params as never);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // in case this tx failed before hitting the mempool (i.e. gas estimation error), reset nonce so we don't skip past the unused nonce\n debug(\"failed, resetting nonce\");\n await nonceManager.resetNonce();\n // retry nonce errors\n // TODO: upgrade p-retry and move this to shouldRetry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n return;\n }\n\n if (String(error).includes(\"transaction underpriced\")) {\n debug(\"got transaction underpriced error, retrying\", error.message);\n return;\n }\n\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n"],"mappings":"uFAWA,OAAS,iBAAiBA,MAA0B,eACpD,OAAOC,MAAY,UAGnB,OAAS,gBAAAC,MAAoB,gBAE7B,OAAS,aAAAC,MAAiB,aAE1B,IAAMC,EAAQA,EAAY,OAAO,eAAe,EAoBhD,eAAsBC,EAQpBC,EACAC,EACAC,EAAyC,CAAC,EACR,CAClC,IAAMC,EAAaF,EAAQ,SAAWD,EAAO,QAC7C,GAAI,CAACG,EAEH,MAAM,IAAI,MAAM,qBAAqB,EAEvC,IAAMC,EAAUC,EAAaF,CAAU,EACjCG,EAAQN,EAAO,MAEfO,EAAe,MAAMC,EAAgB,CACzC,OAAQN,EAAK,cAAgBF,EAC7B,QAASI,EAAQ,QACjB,iBAAkBF,EAAK,gBACzB,CAAC,EAEKO,EAAS,MAAMC,EAAU,CAC7B,OAAQR,EAAK,cAAgBF,EAC7B,gBAAiB,IACjB,KAAM,CAAE,MAAAM,CAAM,CAChB,CAAC,EAED,OAAOC,EAAa,aAAa,IAC/B,IACEI,EACE,SAAY,CACV,IAAMC,EAAQL,EAAa,UAAU,EAC/BM,EAAS,CAEb,SAAU,UACV,GAAGJ,EAAO,KACV,GAAGR,EACH,MAAAW,CACF,EACA,OAAAd,EAAM,UAAWe,EAAO,aAAc,KAAMA,EAAO,QAAS,aAAcD,CAAK,EACxE,MAAMf,EAAUG,EAAQc,EAAoB,eAAe,EAAED,CAAe,CACrF,EACA,CACE,QAAS,EACT,gBAAiB,MAAOE,GAAU,CAMhC,GAJAjB,EAAM,yBAAyB,EAC/B,MAAMS,EAAa,WAAW,EAG1BA,EAAa,iBAAiBQ,CAAK,EAAG,CACxCjB,EAAM,4BAA6BiB,EAAM,OAAO,EAChD,MACF,CAEA,GAAI,OAAOA,CAAK,EAAE,SAAS,yBAAyB,EAAG,CACrDjB,EAAM,8CAA+CiB,EAAM,OAAO,EAClE,MACF,CAEA,MAAMA,CACR,CACF,CACF,EACF,CAAE,eAAgB,EAAK,CACzB,CACF","names":["viem_writeContract","pRetry","parseAccount","getAction","debug","writeContract","client","request","opts","rawAccount","account","parseAccount","chain","nonceManager","getNonceManager","feeRef","getFeeRef","pRetry","nonce","params","viem_writeContract","error"]}
package/dist/foundry.js CHANGED
@@ -1,3 +1,3 @@
1
- import{execa as s}from"execa";async function n(r){let{stdout:t}=await s("forge",["config","--json"],{stdio:["inherit","pipe","pipe"],env:{FOUNDRY_PROFILE:r}});return JSON.parse(t)}async function u(r){return(await n(r)).src}async function f(r){return(await n(r)).script}async function l(r){return(await n(r)).test}async function y(r){return(await n(r)).out}async function m(r){return(await n(r)).eth_rpc_url||"http://127.0.0.1:8545"}async function w(r,t){let i={env:{FOUNDRY_PROFILE:t?.profile,...t?.env},stdout:"inherit",stderr:"pipe",cwd:t?.cwd};await(t?.silent?s("forge",r,i):o("forge",r,i))}async function P(r,t){return o("cast",r,{env:{FOUNDRY_PROFILE:t?.profile}})}async function d(r){return o("anvil",r)}async function o(r,t,i){let g=`${r} ${t.join(" ")}`;try{console.log(`running "${g}"`);let{stdout:e}=await s(r,t,{stdout:"pipe",stderr:"pipe",...i});return e}catch(e){let c=e?.stderr||e?.message||"";throw c+=`
2
- Error running "${g}"`,new Error(c)}}export{d as anvil,P as cast,w as forge,n as getForgeConfig,y as getOutDirectory,m as getRpcUrl,f as getScriptDirectory,u as getSrcDirectory,l as getTestDirectory};
1
+ import{execa as s}from"execa";async function n(r){let{stdout:t}=await s("forge",["config","--json"],{stdio:["inherit","pipe","pipe"],env:{FOUNDRY_PROFILE:r}});return JSON.parse(t)}async function u(r){return(await n(r)).src}async function f(r){return(await n(r)).script}async function l(r){return(await n(r)).test}async function P(r){return(await n(r)).out}async function y(r){return process.env.FOUNDRY_ETH_RPC_URL||process.env.RPC_HTTP_URL||process.env.RPC_URL||(await n(r)).eth_rpc_url||"http://127.0.0.1:8545"}async function m(r,t){let e={env:{FOUNDRY_PROFILE:t?.profile,...t?.env},stdout:"inherit",stderr:"pipe",cwd:t?.cwd};await(t?.silent?s("forge",r,e):o("forge",r,e))}async function w(r,t){return o("cast",r,{env:{FOUNDRY_PROFILE:t?.profile}})}async function R(r){return o("anvil",r)}async function o(r,t,e){let c=`${r} ${t.join(" ")}`;try{console.log(`running "${c}"`);let{stdout:i}=await s(r,t,{stdout:"pipe",stderr:"pipe",...e});return i}catch(i){let g=i?.stderr||i?.message||"";throw g+=`
2
+ Error running "${c}"`,new Error(g)}}export{R as anvil,w as cast,m as forge,n as getForgeConfig,P as getOutDirectory,y as getRpcUrl,f as getScriptDirectory,u as getSrcDirectory,l as getTestDirectory};
3
3
  //# sourceMappingURL=foundry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/foundry/index.ts"],"sourcesContent":["import { execa, Options } from \"execa\";\n\nexport interface ForgeConfig {\n // project\n src: string;\n test: string;\n script: string;\n out: string;\n libs: string[];\n cache: boolean;\n cache_path: string;\n eth_rpc_url: string | null;\n\n // compiler\n remappings: string[];\n\n // all unspecified keys (this interface is far from comprehensive)\n [key: string]: unknown;\n}\n\n/**\n * Get forge config as a parsed json object.\n */\nexport async function getForgeConfig(profile?: string): Promise<ForgeConfig> {\n const { stdout } = await execa(\"forge\", [\"config\", \"--json\"], {\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: { FOUNDRY_PROFILE: profile },\n });\n\n return JSON.parse(stdout) as ForgeConfig;\n}\n\n/**\n * Get the value of \"src\" from forge config.\n * The path to the contract sources relative to the root of the project.\n */\nexport async function getSrcDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).src;\n}\n\n/**\n * Get the value of \"script\" from forge config.\n * The path to the contract sources relative to the root of the project.\n */\nexport async function getScriptDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).script;\n}\n\n/**\n * Get the value of \"test\" from forge config.\n * The path to the test contract sources relative to the root of the project.\n */\nexport async function getTestDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).test;\n}\n\n/**\n * Get the value of \"out\" from forge config.\n * The path to put contract artifacts in, relative to the root of the project.\n */\nexport async function getOutDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).out;\n}\n\n/**\n * Get the value of \"eth_rpc_url\" from forge config, default to \"http://127.0.0.1:8545\"\n * @param profile The foundry profile to use\n * @returns The rpc url\n */\nexport async function getRpcUrl(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).eth_rpc_url || \"http://127.0.0.1:8545\";\n}\n\n/**\n * Execute a forge command\n * @param args The arguments to pass to forge\n * @param options { profile?: The foundry profile to use; silent?: If true, nothing will be logged to the console }\n */\nexport async function forge(\n args: string[],\n options?: { profile?: string; silent?: boolean; env?: NodeJS.ProcessEnv; cwd?: string },\n): Promise<void> {\n const execOptions: Options<string> = {\n env: { FOUNDRY_PROFILE: options?.profile, ...options?.env },\n stdout: \"inherit\",\n stderr: \"pipe\",\n cwd: options?.cwd,\n };\n\n await (options?.silent ? execa(\"forge\", args, execOptions) : execLog(\"forge\", args, execOptions));\n}\n\n/**\n * Execute a cast command\n * @param args The arguments to pass to cast\n * @returns Stdout of the command\n */\nexport async function cast(args: string[], options?: { profile?: string }): Promise<string> {\n return execLog(\"cast\", args, {\n env: { FOUNDRY_PROFILE: options?.profile },\n });\n}\n\n/**\n * Start an anvil chain\n * @param args The arguments to pass to anvil\n * @returns Stdout of the command\n */\nexport async function anvil(args: string[]): Promise<string> {\n return execLog(\"anvil\", args);\n}\n\n/**\n * Executes the given command, returns the stdout, and logs the command to the console.\n * Throws an error if the command fails.\n * @param command The command to execute\n * @param args The arguments to pass to the command\n * @returns The stdout of the command\n */\nasync function execLog(command: string, args: string[], options?: Options<string>): Promise<string> {\n const commandString = `${command} ${args.join(\" \")}`;\n try {\n console.log(`running \"${commandString}\"`);\n const { stdout } = await execa(command, args, { stdout: \"pipe\", stderr: \"pipe\", ...options });\n return stdout;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n let errorMessage = error?.stderr || error?.message || \"\";\n errorMessage += `\\nError running \"${commandString}\"`;\n throw new Error(errorMessage);\n }\n}\n"],"mappings":"AAAA,OAAS,SAAAA,MAAsB,QAuB/B,eAAsBC,EAAeC,EAAwC,CAC3E,GAAM,CAAE,OAAAC,CAAO,EAAI,MAAMH,EAAM,QAAS,CAAC,SAAU,QAAQ,EAAG,CAC5D,MAAO,CAAC,UAAW,OAAQ,MAAM,EACjC,IAAK,CAAE,gBAAiBE,CAAQ,CAClC,CAAC,EAED,OAAO,KAAK,MAAMC,CAAM,CAC1B,CAMA,eAAsBC,EAAgBF,EAAmC,CACvE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,GACzC,CAMA,eAAsBG,EAAmBH,EAAmC,CAC1E,OAAQ,MAAMD,EAAeC,CAAO,GAAG,MACzC,CAMA,eAAsBI,EAAiBJ,EAAmC,CACxE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,IACzC,CAMA,eAAsBK,EAAgBL,EAAmC,CACvE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,GACzC,CAOA,eAAsBM,EAAUN,EAAmC,CACjE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,aAAe,uBACxD,CAOA,eAAsBO,EACpBC,EACAC,EACe,CACf,IAAMC,EAA+B,CACnC,IAAK,CAAE,gBAAiBD,GAAS,QAAS,GAAGA,GAAS,GAAI,EAC1D,OAAQ,UACR,OAAQ,OACR,IAAKA,GAAS,GAChB,EAEA,MAAOA,GAAS,OAASX,EAAM,QAASU,EAAME,CAAW,EAAIC,EAAQ,QAASH,EAAME,CAAW,EACjG,CAOA,eAAsBE,EAAKJ,EAAgBC,EAAiD,CAC1F,OAAOE,EAAQ,OAAQH,EAAM,CAC3B,IAAK,CAAE,gBAAiBC,GAAS,OAAQ,CAC3C,CAAC,CACH,CAOA,eAAsBI,EAAML,EAAiC,CAC3D,OAAOG,EAAQ,QAASH,CAAI,CAC9B,CASA,eAAeG,EAAQG,EAAiBN,EAAgBC,EAA4C,CAClG,IAAMM,EAAgB,GAAGD,CAAO,IAAIN,EAAK,KAAK,GAAG,CAAC,GAClD,GAAI,CACF,QAAQ,IAAI,YAAYO,CAAa,GAAG,EACxC,GAAM,CAAE,OAAAd,CAAO,EAAI,MAAMH,EAAMgB,EAASN,EAAM,CAAE,OAAQ,OAAQ,OAAQ,OAAQ,GAAGC,CAAQ,CAAC,EAC5F,OAAOR,CAET,OAASe,EAAY,CACnB,IAAIC,EAAeD,GAAO,QAAUA,GAAO,SAAW,GACtD,MAAAC,GAAgB;AAAA,iBAAoBF,CAAa,IAC3C,IAAI,MAAME,CAAY,CAC9B,CACF","names":["execa","getForgeConfig","profile","stdout","getSrcDirectory","getScriptDirectory","getTestDirectory","getOutDirectory","getRpcUrl","forge","args","options","execOptions","execLog","cast","anvil","command","commandString","error","errorMessage"]}
1
+ {"version":3,"sources":["../src/foundry/index.ts"],"sourcesContent":["import { execa, Options } from \"execa\";\n\nexport interface ForgeConfig {\n // project\n src: string;\n test: string;\n script: string;\n out: string;\n libs: string[];\n cache: boolean;\n cache_path: string;\n eth_rpc_url: string | null;\n\n // compiler\n remappings: string[];\n\n // all unspecified keys (this interface is far from comprehensive)\n [key: string]: unknown;\n}\n\n/**\n * Get forge config as a parsed json object.\n */\nexport async function getForgeConfig(profile?: string): Promise<ForgeConfig> {\n const { stdout } = await execa(\"forge\", [\"config\", \"--json\"], {\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: { FOUNDRY_PROFILE: profile },\n });\n\n return JSON.parse(stdout) as ForgeConfig;\n}\n\n/**\n * Get the value of \"src\" from forge config.\n * The path to the contract sources relative to the root of the project.\n */\nexport async function getSrcDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).src;\n}\n\n/**\n * Get the value of \"script\" from forge config.\n * The path to the contract sources relative to the root of the project.\n */\nexport async function getScriptDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).script;\n}\n\n/**\n * Get the value of \"test\" from forge config.\n * The path to the test contract sources relative to the root of the project.\n */\nexport async function getTestDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).test;\n}\n\n/**\n * Get the value of \"out\" from forge config.\n * The path to put contract artifacts in, relative to the root of the project.\n */\nexport async function getOutDirectory(profile?: string): Promise<string> {\n return (await getForgeConfig(profile)).out;\n}\n\n/**\n * Get the value of \"eth_rpc_url\" from forge config, default to \"http://127.0.0.1:8545\"\n * @param profile The foundry profile to use\n * @returns The rpc url\n */\nexport async function getRpcUrl(profile?: string): Promise<string> {\n return (\n process.env.FOUNDRY_ETH_RPC_URL ||\n process.env.RPC_HTTP_URL ||\n process.env.RPC_URL ||\n (await getForgeConfig(profile)).eth_rpc_url ||\n \"http://127.0.0.1:8545\"\n );\n}\n\n/**\n * Execute a forge command\n * @param args The arguments to pass to forge\n * @param options { profile?: The foundry profile to use; silent?: If true, nothing will be logged to the console }\n */\nexport async function forge(\n args: string[],\n options?: { profile?: string; silent?: boolean; env?: NodeJS.ProcessEnv; cwd?: string },\n): Promise<void> {\n const execOptions: Options<string> = {\n env: { FOUNDRY_PROFILE: options?.profile, ...options?.env },\n stdout: \"inherit\",\n stderr: \"pipe\",\n cwd: options?.cwd,\n };\n\n await (options?.silent ? execa(\"forge\", args, execOptions) : execLog(\"forge\", args, execOptions));\n}\n\n/**\n * Execute a cast command\n * @param args The arguments to pass to cast\n * @returns Stdout of the command\n */\nexport async function cast(args: string[], options?: { profile?: string }): Promise<string> {\n return execLog(\"cast\", args, {\n env: { FOUNDRY_PROFILE: options?.profile },\n });\n}\n\n/**\n * Start an anvil chain\n * @param args The arguments to pass to anvil\n * @returns Stdout of the command\n */\nexport async function anvil(args: string[]): Promise<string> {\n return execLog(\"anvil\", args);\n}\n\n/**\n * Executes the given command, returns the stdout, and logs the command to the console.\n * Throws an error if the command fails.\n * @param command The command to execute\n * @param args The arguments to pass to the command\n * @returns The stdout of the command\n */\nasync function execLog(command: string, args: string[], options?: Options<string>): Promise<string> {\n const commandString = `${command} ${args.join(\" \")}`;\n try {\n console.log(`running \"${commandString}\"`);\n const { stdout } = await execa(command, args, { stdout: \"pipe\", stderr: \"pipe\", ...options });\n return stdout;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n let errorMessage = error?.stderr || error?.message || \"\";\n errorMessage += `\\nError running \"${commandString}\"`;\n throw new Error(errorMessage);\n }\n}\n"],"mappings":"AAAA,OAAS,SAAAA,MAAsB,QAuB/B,eAAsBC,EAAeC,EAAwC,CAC3E,GAAM,CAAE,OAAAC,CAAO,EAAI,MAAMH,EAAM,QAAS,CAAC,SAAU,QAAQ,EAAG,CAC5D,MAAO,CAAC,UAAW,OAAQ,MAAM,EACjC,IAAK,CAAE,gBAAiBE,CAAQ,CAClC,CAAC,EAED,OAAO,KAAK,MAAMC,CAAM,CAC1B,CAMA,eAAsBC,EAAgBF,EAAmC,CACvE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,GACzC,CAMA,eAAsBG,EAAmBH,EAAmC,CAC1E,OAAQ,MAAMD,EAAeC,CAAO,GAAG,MACzC,CAMA,eAAsBI,EAAiBJ,EAAmC,CACxE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,IACzC,CAMA,eAAsBK,EAAgBL,EAAmC,CACvE,OAAQ,MAAMD,EAAeC,CAAO,GAAG,GACzC,CAOA,eAAsBM,EAAUN,EAAmC,CACjE,OACE,QAAQ,IAAI,qBACZ,QAAQ,IAAI,cACZ,QAAQ,IAAI,UACX,MAAMD,EAAeC,CAAO,GAAG,aAChC,uBAEJ,CAOA,eAAsBO,EACpBC,EACAC,EACe,CACf,IAAMC,EAA+B,CACnC,IAAK,CAAE,gBAAiBD,GAAS,QAAS,GAAGA,GAAS,GAAI,EAC1D,OAAQ,UACR,OAAQ,OACR,IAAKA,GAAS,GAChB,EAEA,MAAOA,GAAS,OAASX,EAAM,QAASU,EAAME,CAAW,EAAIC,EAAQ,QAASH,EAAME,CAAW,EACjG,CAOA,eAAsBE,EAAKJ,EAAgBC,EAAiD,CAC1F,OAAOE,EAAQ,OAAQH,EAAM,CAC3B,IAAK,CAAE,gBAAiBC,GAAS,OAAQ,CAC3C,CAAC,CACH,CAOA,eAAsBI,EAAML,EAAiC,CAC3D,OAAOG,EAAQ,QAASH,CAAI,CAC9B,CASA,eAAeG,EAAQG,EAAiBN,EAAgBC,EAA4C,CAClG,IAAMM,EAAgB,GAAGD,CAAO,IAAIN,EAAK,KAAK,GAAG,CAAC,GAClD,GAAI,CACF,QAAQ,IAAI,YAAYO,CAAa,GAAG,EACxC,GAAM,CAAE,OAAAd,CAAO,EAAI,MAAMH,EAAMgB,EAASN,EAAM,CAAE,OAAQ,OAAQ,OAAQ,OAAQ,GAAGC,CAAQ,CAAC,EAC5F,OAAOR,CAET,OAASe,EAAY,CACnB,IAAIC,EAAeD,GAAO,QAAUA,GAAO,SAAW,GACtD,MAAAC,GAAgB;AAAA,iBAAoBF,CAAa,IAC3C,IAAI,MAAME,CAAY,CAC9B,CACF","names":["execa","getForgeConfig","profile","stdout","getSrcDirectory","getScriptDirectory","getTestDirectory","getOutDirectory","getRpcUrl","forge","args","options","execOptions","execLog","cast","anvil","command","commandString","error","errorMessage"]}
package/dist/index.d.ts CHANGED
@@ -29,12 +29,14 @@ type CreateNonceManagerResult = {
29
29
  getNonce: () => number;
30
30
  nextNonce: () => number;
31
31
  resetNonce: () => Promise<void>;
32
- shouldResetNonce: (error: unknown) => boolean;
32
+ shouldResetNonce: (error: Error) => boolean;
33
33
  mempoolQueue: PQueue;
34
34
  };
35
35
  declare function createNonceManager({ client, address, // TODO: rename to account?
36
36
  blockTag, broadcastChannelName, queueConcurrency, }: CreateNonceManagerOptions): CreateNonceManagerResult;
37
37
 
38
+ declare function findCause(error: Error, fn?: (error: Error) => boolean): Error | null;
39
+
38
40
  declare function getBurnerPrivateKey(cacheKey?: string): Hex;
39
41
 
40
42
  declare function getNonceManager({ client, address, // TODO: rename to account?
@@ -155,4 +157,4 @@ declare const resourceIdToHex: typeof resourceToHex;
155
157
  /** @deprecated use `hexToResource` instead */
156
158
  declare const hexToResourceId: typeof hexToResource;
157
159
 
158
- export { type CreateNonceManagerOptions, type CreateNonceManagerResult, LruMap, type Resource, type ResourceLabel, type ResourceType, type Result, type SendTransactionExtraOptions, type WriteContractExtraOptions, createBenchmark, createBurnerAccount, createContract, createNonceManager, getBurnerPrivateKey, getContract, getNonceManager, getNonceManagerId, hexToResource, hexToResourceId, isError, isOk, logSort, readHex, resourceIdToHex, resourceToHex, resourceToLabel, resourceTypeIds, resourceTypes, sendTransaction, spliceHex, transportObserver, unwrap, writeContract };
160
+ export { type CreateNonceManagerOptions, type CreateNonceManagerResult, LruMap, type Resource, type ResourceLabel, type ResourceType, type Result, type SendTransactionExtraOptions, type WriteContractExtraOptions, createBenchmark, createBurnerAccount, createContract, createNonceManager, findCause, getBurnerPrivateKey, getContract, getNonceManager, getNonceManagerId, hexToResource, hexToResourceId, isError, isOk, logSort, readHex, resourceIdToHex, resourceToHex, resourceToLabel, resourceTypeIds, resourceTypes, sendTransaction, spliceHex, transportObserver, unwrap, writeContract };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as p}from"./chunk-Q7HNDKVJ.js";import{a as K,b as $,c as q,e as _}from"./chunk-GUEDVXKC.js";import{a as B,b as D,c as x,d as L,e as m}from"./chunk-ZIUX7JCQ.js";import{a as l}from"./chunk-TCWGPC6G.js";import h from"debug";var T=h("mud:benchmark");T.log=console.info.bind(console);function U(e){let r=T.extend(e),t=performance.now();return o=>{let n=(performance.now()-t)/1e3;r("%s: +%ds",o,n),t=performance.now()}}import{privateKeyToAccount as P}from"viem/accounts";function Q(e){return{...P(e)}}import{getContract as w}from"viem";function H(e){let r=e.length&&Array.isArray(e[0]),t=r?e[0]:[],o=(r?e[1]:e[0])??{};return{args:t,options:o}}function d({abi:e,address:r,client:{public:t,wallet:o},onWrite:n}){let i=w({abi:e,address:r,client:{public:t,wallet:o}});if(i.write){let s=0;i.write=new Proxy({},{get(F,C){return(...g)=>{let{args:A,options:k}=H(g),c={abi:e,address:r,functionName:C,args:A,...k,onWrite:n},u=p(o,c,{publicClient:t}),y=`${o.chain.id}:${o.account.address}:${s++}`;return n?.({id:y,request:c,result:u}),u}}})}return i}import{generatePrivateKey as v,privateKeyToAccount as f}from"viem/accounts";import{isHex as W}from"viem";function O(e,r){if(!W(e))throw console.error("Private key found in cache is not valid hex",{privateKey:e,cacheKey:r}),new Error(`Private key found in cache (${r}) is not valid hex`);f(e)}function Te(e="mud:burnerWallet"){let r=localStorage.getItem(e);if(r!=null)return O(r,e),r;let t=v();return console.log("New burner wallet created:",f(t)),localStorage.setItem(e,t),t}function fe(e,r){return e.blockNumber===r.blockNumber?e.logIndex===r.logIndex?0:e.logIndex==null?1:r.logIndex==null?-1:e.logIndex-r.logIndex:e.blockNumber==null?1:r.blockNumber==null?-1:e.blockNumber>r.blockNumber?1:e.blockNumber<r.blockNumber?-1:0}var b=class extends Map{constructor(r){super(),this.maxSize=r}set(r,t){return super.set(r,t),this.maxSize&&this.size>this.maxSize&&this.delete(this.keys().next().value),this}};function a(e,r,t){return`0x${e.replace(/^0x/,"").slice(r*2,t!=null?t*2:void 0).padEnd(((t??r)-r)*2,"0")}`}function Ae(e){return"ok"in e}function I(e){return"error"in e}function ke(e){if(I(e))throw e.error;return e.ok}import{concatHex as N}from"viem";function He(e,r,t=0,o="0x"){return N([a(e,0,r),o,a(e,r+t)])}import{keccak256 as E}from"viem";var R=l.extend("transportObserver");function Ee(e){return r=>{let t=e(r);return{...t,request:async n=>{if(n.method==="eth_sendRawTransaction"&&n.params instanceof Array){let i=n.params.map(s=>E(s));R("saw txs",i)}return t.request(n)}}}}var S=d;var G=x;var z=m;export{b as LruMap,U as createBenchmark,Q as createBurnerAccount,S as createContract,$ as createNonceManager,Te as getBurnerPrivateKey,d as getContract,q as getNonceManager,K as getNonceManagerId,m as hexToResource,z as hexToResourceId,I as isError,Ae as isOk,fe as logSort,a as readHex,G as resourceIdToHex,x as resourceToHex,L as resourceToLabel,D as resourceTypeIds,B as resourceTypes,_ as sendTransaction,He as spliceHex,Ee as transportObserver,ke as unwrap,p as writeContract};
1
+ import{a as p}from"./chunk-DPUUE7NM.js";import{a as K,b as $,c as q,d as B,f as j}from"./chunk-6FIKI2CG.js";import{a as D,b as L,c as x,d as _,e as m}from"./chunk-ZIUX7JCQ.js";import{a as l}from"./chunk-TCWGPC6G.js";import h from"debug";var T=h("mud:benchmark");T.log=console.info.bind(console);function J(e){let r=T.extend(e),t=performance.now();return o=>{let n=(performance.now()-t)/1e3;r("%s: +%ds",o,n),t=performance.now()}}import{privateKeyToAccount as P}from"viem/accounts";function V(e){return{...P(e)}}import{generatePrivateKey as w,privateKeyToAccount as d}from"viem/accounts";import{isHex as H}from"viem";function v(e,r){if(!H(e))throw console.error("Private key found in cache is not valid hex",{privateKey:e,cacheKey:r}),new Error(`Private key found in cache (${r}) is not valid hex`);d(e)}function re(e="mud:burnerWallet"){let r=localStorage.getItem(e);if(r!=null)return v(r,e),r;let t=w();return console.log("New burner wallet created:",d(t)),localStorage.setItem(e,t),t}import{getContract as W}from"viem";function O(e){let r=e.length&&Array.isArray(e[0]),t=r?e[0]:[],o=(r?e[1]:e[0])??{};return{args:t,options:o}}function f({abi:e,address:r,client:{public:t,wallet:o},onWrite:n}){let i=W({abi:e,address:r,client:{public:t,wallet:o}});if(i.write){let s=0;i.write=new Proxy({},{get(F,C){return(...g)=>{let{args:A,options:k}=O(g),c={abi:e,address:r,functionName:C,args:A,...k,onWrite:n},u=p(o,c,{publicClient:t}),y=`${o.chain.id}:${o.account.address}:${s++}`;return n?.({id:y,request:c,result:u}),u}}})}return i}function be(e,r){return e.blockNumber===r.blockNumber?e.logIndex===r.logIndex?0:e.logIndex==null?1:r.logIndex==null?-1:e.logIndex-r.logIndex:e.blockNumber==null?1:r.blockNumber==null?-1:e.blockNumber>r.blockNumber?1:e.blockNumber<r.blockNumber?-1:0}var b=class extends Map{constructor(r){super(),this.maxSize=r}set(r,t){return super.set(r,t),this.maxSize&&this.size>this.maxSize&&this.delete(this.keys().next().value),this}};function a(e,r,t){return`0x${e.replace(/^0x/,"").slice(r*2,t!=null?t*2:void 0).padEnd(((t??r)-r)*2,"0")}`}function ke(e){return"ok"in e}function I(e){return"error"in e}function ye(e){if(I(e))throw e.error;return e.ok}import{concatHex as N}from"viem";function ve(e,r,t=0,o="0x"){return N([a(e,0,r),o,a(e,r+t)])}import{keccak256 as E}from"viem";var R=l.extend("transportObserver");function Re(e){return r=>{let t=e(r);return{...t,request:async n=>{if(n.method==="eth_sendRawTransaction"&&n.params instanceof Array){let i=n.params.map(s=>E(s));R("saw txs",i)}return t.request(n)}}}}var S=f;var G=x;var z=m;export{b as LruMap,J as createBenchmark,V as createBurnerAccount,S as createContract,q as createNonceManager,$ as findCause,re as getBurnerPrivateKey,f as getContract,B as getNonceManager,K as getNonceManagerId,m as hexToResource,z as hexToResourceId,I as isError,ke as isOk,be as logSort,a as readHex,G as resourceIdToHex,x as resourceToHex,_ as resourceToLabel,L as resourceTypeIds,D as resourceTypes,j as sendTransaction,ve as spliceHex,Re as transportObserver,ye as unwrap,p 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/logSort.ts","../src/LruMap.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: GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n } = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as never;\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: WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n > = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as never;\n const result = writeContract(walletClient, request, { publicClient }) as never;\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;\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","type PartialLog = { readonly blockNumber: bigint | null; readonly logIndex: number | null };\n\nexport function logSort(a: PartialLog, b: PartialLog): number {\n if (a.blockNumber === b.blockNumber) {\n if (a.logIndex === b.logIndex) return 0;\n if (a.logIndex == null) return 1;\n if (b.logIndex == null) return -1;\n return a.logIndex - b.logIndex;\n }\n\n if (a.blockNumber == null) return 1;\n if (b.blockNumber == null) return -1;\n if (a.blockNumber > b.blockNumber) return 1;\n if (a.blockNumber < b.blockNumber) return -1;\n return 0;\n}\n","/**\n * Map with a LRU (least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n * @link https://github.com/wevm/viem/blob/0fa08e113a890e6672fdc64fa7a2206a840611ab/src/utils/lru.ts\n */\nexport class LruMap<key, value> extends Map<key, value> {\n maxSize: number;\n\n constructor(size: number) {\n super();\n this.maxSize = size;\n }\n\n override set(key: key, value: value): this {\n super.set(key, value);\n if (this.maxSize && this.size > this.maxSize) {\n this.delete(this.keys().next().value);\n }\n return this;\n }\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","logSort","a","b","LruMap","size","key","value","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/getBurnerPrivateKey.ts","../src/getContract.ts","../src/logSort.ts","../src/LruMap.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 { 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 {\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: GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n } = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as never;\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: WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n > = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as never;\n const result = writeContract(walletClient, request, { publicClient }) as never;\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;\n}\n","type PartialLog = { readonly blockNumber: bigint | null; readonly logIndex: number | null };\n\nexport function logSort(a: PartialLog, b: PartialLog): number {\n if (a.blockNumber === b.blockNumber) {\n if (a.logIndex === b.logIndex) return 0;\n if (a.logIndex == null) return 1;\n if (b.logIndex == null) return -1;\n return a.logIndex - b.logIndex;\n }\n\n if (a.blockNumber == null) return 1;\n if (b.blockNumber == null) return -1;\n if (a.blockNumber > b.blockNumber) return 1;\n if (a.blockNumber < b.blockNumber) return -1;\n return 0;\n}\n","/**\n * Map with a LRU (least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n * @link https://github.com/wevm/viem/blob/0fa08e113a890e6672fdc64fa7a2206a840611ab/src/utils/lru.ts\n */\nexport class LruMap<key, value> extends Map<key, value> {\n maxSize: number;\n\n constructor(size: number) {\n super();\n this.maxSize = size;\n }\n\n override set(key: key, value: value): this {\n super.set(key, value);\n if (this.maxSize && this.size > this.maxSize) {\n this.delete(this.keys().next().value);\n }\n return this;\n }\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":"wNAAA,OAAOA,MAAiB,QAExB,IAAMC,EAAcD,EAAY,eAAe,EAG/CC,EAAY,IAAM,QAAQ,KAAK,KAAK,OAAO,EAEpC,SAASC,EAAgBC,EAA+C,CAC7E,IAAMC,EAAQH,EAAY,OAAOE,CAAS,EACtCE,EAAW,YAAY,IAAI,EAE/B,OAAQC,GAAqB,CAC3B,IAAMC,GAAwB,YAAY,IAAI,EAAIF,GAAY,IAC9DD,EAAM,WAAYE,EAAUC,CAAoB,EAChDF,EAAW,YAAY,IAAI,CAC7B,CACF,CCfA,OAAS,uBAAAG,MAA2B,gBAE7B,SAASC,EAAoBC,EAAoC,CAGtE,MAAO,CACL,GAHcF,EAAoBE,CAAU,CAI9C,CACF,CCTA,OAAS,sBAAAC,EAAoB,uBAAAC,MAA2B,gBACxD,OAAS,SAAAC,MAAkB,OAE3B,SAASC,EAAiBC,EAAoBC,EAA6C,CACzF,GAAI,CAACH,EAAME,CAAU,EACnB,cAAQ,MAAM,8CAA+C,CAAE,WAAAA,EAAY,SAAAC,CAAS,CAAC,EAC/E,IAAI,MAAM,+BAA+BA,CAAQ,oBAAoB,EAI7EJ,EAAoBG,CAAU,CAChC,CAEO,SAASE,GAAoBD,EAAW,mBAAyB,CACtE,IAAME,EAAmB,aAAa,QAAQF,CAAQ,EAEtD,GAAIE,GAAoB,KACtB,OAAAJ,EAAiBI,EAAkBF,CAAQ,EACpCE,EAGT,IAAMH,EAAaJ,EAAmB,EACtC,eAAQ,IAAI,6BAA8BC,EAAoBG,CAAU,CAAC,EACzE,aAAa,QAAQC,EAAUD,CAAU,EAClCA,CACT,CCzBA,OAcE,eAAeI,MACV,OAMP,SAASC,EAAsBC,EAG7B,CACA,IAAMC,EAAUD,EAAO,QAAU,MAAM,QAAQA,EAAO,CAAC,CAAC,EAClDE,EAAOD,EAAUD,EAAO,CAAC,EAAK,CAAC,EAC/BG,GAAWF,EAAUD,EAAO,CAAC,EAAIA,EAAO,CAAC,IAAM,CAAC,EACtD,MAAO,CAAE,KAAAE,EAAM,QAAAC,CAAQ,CACzB,CA8BO,SAASC,EAQd,CACA,IAAAC,EACA,QAAAC,EACA,OAAQ,CAAE,OAAQC,EAAc,OAAQC,CAAa,EACrD,QAAAC,CACF,EAQ4F,CAC1F,IAAMC,EAEFC,EAAiB,CACnB,IAAAN,EACA,QAAAC,EACA,OAAQ,CACN,OAAQC,EACR,OAAQC,CACV,CACF,CAAC,EAED,GAAIE,EAAS,MAAO,CAElB,IAAIE,EAAc,EAClBF,EAAS,MAAQ,IAAI,MACnB,CAAC,EACD,CACE,IAAIG,EAAGC,EAAsB,CAC3B,MAAO,IACFC,IAIA,CACH,GAAM,CAAE,KAAAb,EAAM,QAAAC,CAAQ,EAAIJ,EAAsBgB,CAAU,EACpDC,EAMF,CACF,IAAAX,EACA,QAAAC,EACA,aAAAQ,EACA,KAAAZ,EACA,GAAGC,EACH,QAAAM,CACF,EACMQ,EAASC,EAAcV,EAAcQ,EAAS,CAAE,aAAAT,CAAa,CAAC,EAE9DY,EAAK,GAAGX,EAAa,MAAM,EAAE,IAAIA,EAAa,QAAQ,OAAO,IAAII,GAAa,GACpF,OAAAH,IAAU,CACR,GAAAU,EACA,QAASH,EACT,OAAAC,CACF,CAAC,EAEMA,CACT,CACF,CACF,CACF,CACF,CAEA,OAAOP,CACT,CCvIO,SAASU,GAAQC,EAAeC,EAAuB,CAC5D,OAAID,EAAE,cAAgBC,EAAE,YAClBD,EAAE,WAAaC,EAAE,SAAiB,EAClCD,EAAE,UAAY,KAAa,EAC3BC,EAAE,UAAY,KAAa,GACxBD,EAAE,SAAWC,EAAE,SAGpBD,EAAE,aAAe,KAAa,EAC9BC,EAAE,aAAe,KAAa,GAC9BD,EAAE,YAAcC,EAAE,YAAoB,EACtCD,EAAE,YAAcC,EAAE,YAAoB,GACnC,CACT,CCTO,IAAMC,EAAN,cAAiC,GAAgB,CAGtD,YAAYC,EAAc,CACxB,MAAM,EACN,KAAK,QAAUA,CACjB,CAES,IAAIC,EAAUC,EAAoB,CACzC,aAAM,IAAID,EAAKC,CAAK,EAChB,KAAK,SAAW,KAAK,KAAO,KAAK,SACnC,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,EAE/B,IACT,CACF,ECZO,SAASC,EAAQC,EAAWC,EAAeC,EAAmB,CACnE,MAAO,KAAKF,EACT,QAAQ,MAAO,EAAE,EACjB,MAAMC,EAAQ,EAAGC,GAAO,KAAOA,EAAM,EAAI,MAAS,EAClD,SAASA,GAAOD,GAASA,GAAS,EAAG,GAAG,CAAC,EAC9C,CCXO,SAASE,GAAcC,EAA+C,CAC3E,MAAO,OAAQA,CACjB,CAEO,SAASC,EAAiBD,EAAmD,CAClF,MAAO,UAAWA,CACpB,CAEO,SAASE,GAAgBF,EAA6B,CAC3D,GAAIC,EAAQD,CAAM,EAChB,MAAMA,EAAO,MAEf,OAAOA,EAAO,EAChB,CChBA,OAAc,aAAAG,MAAiB,OAGxB,SAASC,GAAUC,EAAWC,EAAeC,EAAc,EAAGC,EAAe,KAAW,CAC7F,OAAOC,EAAU,CAACC,EAAQL,EAAM,EAAGC,CAAK,EAAGE,EAASE,EAAQL,EAAMC,EAAQC,CAAW,CAAC,CAAC,CACzF,CCLA,OAAyB,aAAAI,MAAiB,OAG1C,IAAMC,EAAQA,EAAY,OAAO,mBAAmB,EAE7C,SAASC,GAAgDC,EAAmC,CACjG,OAASC,GAAS,CAChB,IAAMC,EAASF,EAAUC,CAAI,EAU7B,MAAO,CACL,GAAGC,EACH,QAXqC,MAAOC,GAAQ,CACpD,GAAIA,EAAI,SAAW,0BAA4BA,EAAI,kBAAkB,MAAO,CAC1E,IAAMC,EAAMD,EAAI,OAAO,IAAKE,GAAcC,EAAUD,CAAI,CAAC,EACzDP,EAAM,UAAWM,CAAG,CAEtB,CAEA,OAAOF,EAAO,QAAQC,CAAG,CAC3B,CAIA,CACF,CACF,CCnBO,IAAMI,EAAiBC,ECAvB,IAAMC,EAAkBC,ECAxB,IAAMC,EAAkBC","names":["createDebug","parentDebug","createBenchmark","namespace","debug","lastStep","stepName","secondsSinceLastStep","privateKeyToAccount","createBurnerAccount","privateKey","generatePrivateKey","privateKeyToAccount","isHex","assertPrivateKey","privateKey","cacheKey","getBurnerPrivateKey","cachedPrivateKey","viem_getContract","getFunctionParameters","values","hasArgs","args","options","getContract","abi","address","publicClient","walletClient","onWrite","contract","viem_getContract","nextWriteId","_","functionName","parameters","request","result","writeContract","id","logSort","a","b","LruMap","size","key","value","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/dist/internal.js CHANGED
@@ -1,4 +1,4 @@
1
- import{e as g}from"./chunk-GUEDVXKC.js";import{a as c}from"./chunk-TCWGPC6G.js";import{a as x}from"./chunk-ZV2KGJCD.js";import{waitForTransactionReceipt as T}from"viem/actions";async function C({client:e,hashes:o,debugLabel:a="transactions"}){if(o.length){c(`waiting for ${a} to confirm`);for(let r of o)if((await T(e,{hash:r})).status==="reverted")throw new Error(`Transaction reverted: ${r}`)}}import{concatHex as H,getCreate2Address as R}from"viem";import{getCode as P}from"viem/actions";import{stringToHex as $}from"viem";var p=$("",{size:32}),l=parseInt("6000",16);var f=c.extend("deploy"),E=c.extend("deploy");f.log=console.debug.bind(console);E.log=console.error.bind(console);async function h({client:e,deployerAddress:o,bytecode:a,deployedBytecodeSize:r,debugLabel:t="contract",salt:s=p}){if(a.includes("__$"))throw new Error(`Found unlinked public library in ${t} bytecode`);let i=R({from:o,salt:s,bytecode:a});return await P(e,{address:i,blockTag:"pending"})?(f("found",t,"at",i),[]):(r!=null&&(r>l?console.warn(`
1
+ import{f as g}from"./chunk-6FIKI2CG.js";import{a as c}from"./chunk-TCWGPC6G.js";import{a as x}from"./chunk-ZV2KGJCD.js";import{waitForTransactionReceipt as T}from"viem/actions";async function C({client:e,hashes:o,debugLabel:a="transactions"}){if(o.length){c(`waiting for ${a} to confirm`);for(let r of o)if((await T(e,{hash:r})).status==="reverted")throw new Error(`Transaction reverted: ${r}`)}}import{concatHex as H,getCreate2Address as R}from"viem";import{getCode as P}from"viem/actions";import{stringToHex as $}from"viem";var p=$("",{size:32}),l=parseInt("6000",16);var f=c.extend("deploy"),E=c.extend("deploy");f.log=console.debug.bind(console);E.log=console.error.bind(console);async function h({client:e,deployerAddress:o,bytecode:a,deployedBytecodeSize:r,debugLabel:t="contract",salt:s=p}){if(a.includes("__$"))throw new Error(`Found unlinked public library in ${t} bytecode`);let i=R({from:o,salt:s,bytecode:a});return await P(e,{address:i,blockTag:"pending"})?(f("found",t,"at",i),[]):(r!=null&&(r>l?console.warn(`
2
2
  Bytecode for ${t} (${r} bytes) is over the contract size limit (${l} bytes). Run \`forge build --sizes\` for more info.
3
3
  `):r>l*.95&&console.warn(`
4
4
  Bytecode for ${t} (${r} bytes) is almost over the contract size limit (${l} bytes). Run \`forge build --sizes\` for more info.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/common",
3
- "version": "2.2.17-ffefc8f000769d5ca625dd19290007a853a21788",
3
+ "version": "2.2.17",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -69,7 +69,7 @@
69
69
  "p-retry": "^5.1.2",
70
70
  "prettier": "3.2.5",
71
71
  "prettier-plugin-solidity": "1.3.1",
72
- "@latticexyz/schema-type": "2.2.17-ffefc8f000769d5ca625dd19290007a853a21788"
72
+ "@latticexyz/schema-type": "2.2.17"
73
73
  },
74
74
  "devDependencies": {
75
75
  "@types/debug": "^4.1.7",
@@ -1,2 +0,0 @@
1
- import{a as d}from"./chunk-TCWGPC6G.js";import{getAddress as F}from"viem";import{getChainId as O}from"viem/actions";import{getAction as v}from"viem/utils";async function f({client:e,address:t,blockTag:o}){return`mud:createNonceManager:${e.chain?.id??await v(e,O,"getChainId")({})}:${F(t)}:${o}`}import{BaseError as E,NonceTooHighError as I,NonceTooLowError as S}from"viem";import{getTransactionCount as A}from"viem/actions";import k from"p-queue";import{getAction as B}from"viem/utils";var N=d.extend("createNonceManager");function C({client:e,address:t,blockTag:o="latest",broadcastChannelName:r,queueConcurrency:a=1}){let n={nonce:-1,noncePromise:null},i=null;typeof BroadcastChannel<"u"&&(r?Promise.resolve(r):f({client:e,address:t,blockTag:o})).then(m=>{i=new BroadcastChannel(m),i.addEventListener("message",M=>{let h=JSON.parse(M.data);N("got nonce from broadcast channel",h),n.nonce=h})});function s(){return n.nonce>=0}function c(){if(!s())throw new Error("call resetNonce before using getNonce");return n.nonce}function p(){if(!s())throw new Error("call resetNonce before using nextNonce");let u=n.nonce++;return i?.postMessage(JSON.stringify(n.nonce)),u}async function y(){n.noncePromise??=(async()=>{n.nonce=await B(e,A,"getTransactionCount")({address:t,blockTag:o}),n.noncePromise=null,i?.postMessage(JSON.stringify(n.nonce)),N("reset nonce to",n.nonce)})(),await n.noncePromise}function P(u){return u instanceof E&&u.walk(m=>m instanceof S||m instanceof I)!=null}let b=new k({concurrency:a});return{hasNonce:s,getNonce:c,nextNonce:p,resetNonce:y,shouldResetNonce:P,mempoolQueue:b}}var l=new Map;async function R({client:e,address:t,blockTag:o="latest",...r}){let a=await f({client:e,address:t,blockTag:o}),n=l.get(a)??C({client:e,address:t,blockTag:o,...r});return l.has(a)||l.set(a,n),n.hasNonce()||await n.resetNonce(),n}import{sendTransaction as D}from"viem/actions";import J from"p-retry";import{parseAccount as U}from"viem/accounts";import{getChainId as H}from"viem/actions";import{estimateFeesPerGas as q}from"viem/actions";import{getAction as G}from"viem/utils";async function T({client:e,args:t,refreshInterval:o}){let r={fees:{},lastUpdatedTimestamp:0};async function a(){let n=await G(e,q,"estimateFeesPerGas")(t);r.fees=n,r.lastUpdatedTimestamp=Date.now()}return setInterval(a,o),await a(),r}import{getAction as Q}from"viem/utils";var w=new Map;async function x(e){let t=e.args?.chain?.id??e.client.chain?.id??await Q(e.client,H,"getChainId")({}),o=w.get(t);if(o)return o;let r=await T(e);return w.set(t,r),r}import{getAction as $}from"viem/utils";var g=d.extend("sendTransaction");async function Oe(e,t,o={}){let r=t.account??e.account;if(!r)throw new Error("No account provided");let a=U(r),n=e.chain,i=await R({client:o.publicClient??e,address:a.address,queueConcurrency:o.queueConcurrency}),s=await x({client:o.publicClient??e,refreshInterval:1e4,args:{chain:n}});return await i.mempoolQueue.add(()=>J(async()=>{let c=i.nextNonce(),p={blockTag:"pending",...s.fees,...t,nonce:c};return g("sending tx to",t.to,"with nonce",c),await $(e,D,"sendTransaction")(p)},{retries:3,onFailedAttempt:async c=>{if(g("failed, resetting nonce"),await i.resetNonce(),i.shouldResetNonce(c)){g("got nonce error, retrying",c.message);return}if(String(c).includes("transaction underpriced")){g("got transaction underpriced error, retrying",c.message);return}throw c}}),{throwOnTimeout:!0})}export{f as a,C as b,R as c,x as d,Oe as e};
2
- //# sourceMappingURL=chunk-GUEDVXKC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/getNonceManagerId.ts","../src/createNonceManager.ts","../src/getNonceManager.ts","../src/sendTransaction.ts","../src/getFeeRef.ts","../src/createFeeRef.ts"],"sourcesContent":["import { BlockTag, Client, Hex, getAddress } from \"viem\";\nimport { getChainId } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\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 getAction(client, getChainId, \"getChainId\")({}));\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\";\nimport { getAction } from \"viem/utils\";\n\nconst debug = parentDebug.extend(\"createNonceManager\");\n\nexport type CreateNonceManagerOptions = {\n client: Client;\n address: Hex;\n blockTag?: BlockTag;\n broadcastChannelName?: string;\n queueConcurrency?: number;\n};\n\nexport type CreateNonceManagerResult = {\n hasNonce: () => boolean;\n getNonce: () => number;\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 = \"latest\",\n broadcastChannelName,\n queueConcurrency = 1,\n}: CreateNonceManagerOptions): CreateNonceManagerResult {\n const ref = { nonce: -1, noncePromise: null as Promise<void> | null };\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 ref.nonce = nonce;\n });\n });\n }\n\n function hasNonce(): boolean {\n return ref.nonce >= 0;\n }\n\n function getNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using getNonce\");\n return ref.nonce;\n }\n\n function nextNonce(): number {\n if (!hasNonce()) throw new Error(\"call resetNonce before using nextNonce\");\n const nonce = ref.nonce++;\n channel?.postMessage(JSON.stringify(ref.nonce));\n return nonce;\n }\n\n async function resetNonce(): Promise<void> {\n ref.noncePromise ??= (async (): Promise<void> => {\n ref.nonce = await getAction(client, getTransactionCount, \"getTransactionCount\")({ address, blockTag });\n ref.noncePromise = null;\n channel?.postMessage(JSON.stringify(ref.nonce));\n debug(\"reset nonce to\", ref.nonce);\n })();\n await ref.noncePromise;\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: queueConcurrency });\n\n return {\n hasNonce,\n getNonce,\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 = \"latest\",\n ...opts\n}: CreateNonceManagerOptions): Promise<CreateNonceManagerResult> {\n const id = await getNonceManagerId({ client, address, blockTag });\n\n const nonceManager = nonceManagers.get(id) ?? createNonceManager({ client, address, blockTag, ...opts });\n if (!nonceManagers.has(id)) {\n nonceManagers.set(id, nonceManager);\n }\n\n if (!nonceManager.hasNonce()) {\n await nonceManager.resetNonce();\n }\n\n return nonceManager;\n}\n","import {\n Account,\n Chain,\n Client,\n SendTransactionParameters,\n Transport,\n SendTransactionReturnType,\n SendTransactionRequest,\n} from \"viem\";\nimport { 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\";\nimport { getFeeRef } from \"./getFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst debug = parentDebug.extend(\"sendTransaction\");\n\nexport type SendTransactionExtraOptions<chain extends Chain | undefined> = {\n /**\n * `publicClient` can be provided to be used in place of the extended viem client for making public action calls\n * (`getChainId`, `getTransactionCount`, `call`). This helps in cases where the extended\n * viem client is a smart account client, like in [permissionless.js](https://github.com/pimlicolabs/permissionless.js),\n * where the transport is the bundler, not an RPC.\n */\n publicClient?: Client<Transport, chain>;\n /**\n * Adjust the number of concurrent calls to the mempool. This defaults to `1` to ensure transactions are ordered\n * and nonces are handled properly. Any number greater than that is likely to see nonce errors and/or transactions\n * arriving out of order, but this may be an acceptable trade-off for some applications that can safely retry.\n * @default 1\n */\n queueConcurrency?: number;\n};\n\n/** @deprecated Use `walletClient.extend(transactionQueue())` instead. */\nexport async function sendTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends SendTransactionRequest<chain, chainOverride>,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n request: SendTransactionParameters<chain, account, chainOverride, request>,\n opts: SendTransactionExtraOptions<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 const chain = client.chain;\n\n const nonceManager = await getNonceManager({\n client: opts.publicClient ?? client,\n address: account.address,\n queueConcurrency: opts.queueConcurrency,\n });\n\n const feeRef = await getFeeRef({\n client: opts.publicClient ?? client,\n refreshInterval: 10000,\n args: { chain },\n });\n\n return await nonceManager.mempoolQueue.add(\n () =>\n pRetry(\n async () => {\n const nonce = nonceManager.nextNonce();\n const params = {\n // viem_sendTransaction internally estimates gas, which we want to happen on the pending block\n blockTag: \"pending\",\n ...feeRef.fees,\n ...request,\n nonce,\n } as const satisfies SendTransactionParameters<chain, account, chainOverride, request>;\n debug(\"sending tx to\", request.to, \"with nonce\", nonce);\n return await getAction(client, viem_sendTransaction, \"sendTransaction\")(params as never);\n },\n {\n retries: 3,\n onFailedAttempt: async (error) => {\n // in case this tx failed before hitting the mempool (i.e. gas estimation error), reset nonce so we don't skip past the unused nonce\n debug(\"failed, resetting nonce\");\n await nonceManager.resetNonce();\n // retry nonce errors\n // TODO: upgrade p-retry and move this to shouldRetry\n if (nonceManager.shouldResetNonce(error)) {\n debug(\"got nonce error, retrying\", error.message);\n return;\n }\n\n if (String(error).includes(\"transaction underpriced\")) {\n debug(\"got transaction underpriced error, retrying\", error.message);\n return;\n }\n\n throw error;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n}\n","import { getChainId } from \"viem/actions\";\nimport { CreateFeeRefOptions, FeeRef, createFeeRef } from \"./createFeeRef\";\nimport { getAction } from \"viem/utils\";\n\nconst feeRefs = new Map<number, FeeRef>();\n\nexport async function getFeeRef(opts: CreateFeeRefOptions): Promise<FeeRef> {\n const chainId =\n opts.args?.chain?.id ?? opts.client.chain?.id ?? (await getAction(opts.client, getChainId, \"getChainId\")({}));\n\n const existingFeeRef = feeRefs.get(chainId);\n if (existingFeeRef) {\n return existingFeeRef;\n }\n\n const feeRef = await createFeeRef(opts);\n feeRefs.set(chainId, feeRef);\n return feeRef;\n}\n","import { EstimateFeesPerGasParameters, Client, EstimateFeesPerGasReturnType } from \"viem\";\nimport { estimateFeesPerGas } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\n\nexport type CreateFeeRefOptions = {\n client: Client;\n refreshInterval: number;\n args?: EstimateFeesPerGasParameters;\n};\n\nexport type FeeRef = {\n fees: EstimateFeesPerGasReturnType | {};\n lastUpdatedTimestamp: number;\n};\n\n/** Update fee values once every `refreshInterval` instead of right before every request */\nexport async function createFeeRef({ client, args, refreshInterval }: CreateFeeRefOptions): Promise<FeeRef> {\n const feeRef: FeeRef = { fees: {}, lastUpdatedTimestamp: 0 };\n\n async function updateFees(): Promise<void> {\n const fees = await getAction(client, estimateFeesPerGas, \"estimateFeesPerGas\")(args);\n feeRef.fees = fees;\n feeRef.lastUpdatedTimestamp = Date.now();\n }\n\n setInterval(updateFees, refreshInterval);\n await updateFees();\n\n return feeRef;\n}\n"],"mappings":"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","names":["getAddress","getChainId","getAction","getNonceManagerId","client","address","blockTag","BaseError","NonceTooHighError","NonceTooLowError","getTransactionCount","PQueue","getAction","debug","createNonceManager","client","address","blockTag","broadcastChannelName","queueConcurrency","ref","channel","getNonceManagerId","name","event","nonce","hasNonce","getNonce","nextNonce","resetNonce","shouldResetNonce","error","BaseError","e","NonceTooLowError","NonceTooHighError","mempoolQueue","nonceManagers","getNonceManager","client","address","blockTag","opts","id","getNonceManagerId","nonceManager","createNonceManager","viem_sendTransaction","pRetry","parseAccount","getChainId","estimateFeesPerGas","getAction","createFeeRef","client","args","refreshInterval","feeRef","updateFees","fees","getAction","feeRefs","getFeeRef","opts","chainId","getChainId","existingFeeRef","feeRef","createFeeRef","getAction","debug","sendTransaction","client","request","opts","rawAccount","account","parseAccount","chain","nonceManager","getNonceManager","feeRef","getFeeRef","pRetry","nonce","params","viem_sendTransaction","error"]}
@@ -1,2 +0,0 @@
1
- import{c as u,d}from"./chunk-GUEDVXKC.js";import{a as s}from"./chunk-TCWGPC6G.js";import{writeContract as f}from"viem/actions";import g from"p-retry";import{parseAccount as h}from"viem/accounts";import{getAction as l}from"viem/utils";var r=s.extend("writeContract");async function T(e,c,a={}){let i=c.account??e.account;if(!i)throw new Error("No account provided");let m=h(i),p=e.chain,t=await u({client:a.publicClient??e,address:m.address,queueConcurrency:a.queueConcurrency}),C=await d({client:a.publicClient??e,refreshInterval:1e4,args:{chain:p}});return t.mempoolQueue.add(()=>g(async()=>{let n=t.nextNonce(),o={blockTag:"pending",...C.fees,...c,nonce:n};return r("calling",o.functionName,"at",o.address,"with nonce",n),await l(e,f,"writeContract")(o)},{retries:3,onFailedAttempt:async n=>{if(r("failed, resetting nonce"),await t.resetNonce(),t.shouldResetNonce(n)){r("got nonce error, retrying",n.message);return}if(String(n).includes("transaction underpriced")){r("got transaction underpriced error, retrying",n.message);return}throw n}}),{throwOnTimeout:!0})}export{T as a};
2
- //# sourceMappingURL=chunk-Q7HNDKVJ.js.map