@latticexyz/world 2.2.22-ca7a36a114ba65468662dbeef343129fa60f04eb → 2.2.22-d621dc7c427a59eb74f4d379862646355a149338
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/internal.d.ts +16 -2
- package/dist/internal.js +113 -45
- package/dist/internal.js.map +1 -1
- package/dist/node.js +63 -42
- package/dist/node.js.map +1 -1
- package/out/AccessManagementSystem.sol/AccessManagementSystem.json +1 -1
- package/out/AccessManagementSystemLib.sol/AccessManagementSystemLib.json +1 -1
- package/out/AccessManagementSystemLib.sol/_grantAccess_ResourceId_address.json +1 -1
- package/out/AccessManagementSystemLib.sol/_renounceOwnership_ResourceId.json +1 -1
- package/out/AccessManagementSystemLib.sol/_revokeAccess_ResourceId_address.json +1 -1
- package/out/AccessManagementSystemLib.sol/_transferOwnership_ResourceId_address.json +1 -1
- package/out/BalanceTransferSystem.sol/BalanceTransferSystem.json +1 -1
- package/out/BalanceTransferSystemLib.sol/BalanceTransferSystemLib.json +1 -1
- package/out/BalanceTransferSystemLib.sol/_transferBalanceToAddress_ResourceId_address_uint256.json +1 -1
- package/out/BalanceTransferSystemLib.sol/_transferBalanceToNamespace_ResourceId_ResourceId_uint256.json +1 -1
- package/out/BatchCall.t.sol/BatchCallTest.json +1 -1
- package/out/BatchCall.t.sol/TestSystem.json +1 -1
- package/out/BatchCallSystem.sol/BatchCallSystem.json +1 -1
- package/out/BatchCallSystemLib.sol/BatchCallSystemLib.json +1 -1
- package/out/BatchCallSystemLib.sol/_batchCallFrom_SystemCallFromDataArray.json +1 -1
- package/out/BatchCallSystemLib.sol/_batchCall_SystemCallDataArray.json +1 -1
- package/out/DelegationControl.sol/DelegationControl.json +1 -1
- package/out/DelegationControlMock.sol/DelegationControlMock.json +1 -1
- package/out/Factories.t.sol/FactoriesTest.json +1 -1
- package/out/IBaseWorld.sol/IBaseWorld.json +1 -1
- package/out/IWorldRegistrationSystem.sol/IWorldRegistrationSystem.json +1 -1
- package/out/InitModule.sol/InitModule.json +1 -1
- package/out/InitModule.t.sol/InitModuleTest.json +1 -1
- package/out/InitModule.t.sol/WorldMock.json +1 -1
- package/out/InitSystems.t.sol/LimitedCallContextTest.json +1 -1
- package/out/ModuleInstallationSystem.sol/ModuleInstallationSystem.json +1 -1
- package/out/ModuleInstallationSystemLib.sol/ModuleInstallationSystemLib.json +1 -1
- package/out/ModuleInstallationSystemLib.sol/_installModule_IModule_bytes.json +1 -1
- package/out/RegistrationSystem.sol/RegistrationSystem.json +1 -1
- package/out/RegistrationSystemLib.sol/RegistrationSystemLib.json +1 -1
- package/out/StoreRegistrationSystem.sol/StoreRegistrationSystem.json +1 -1
- package/out/StoreRegistrationSystemLib.sol/StoreRegistrationSystemLib.json +1 -1
- package/out/StoreRegistrationSystemLib.sol/_registerStoreHook_ResourceId_IStoreHook_uint8.json +1 -1
- package/out/StoreRegistrationSystemLib.sol/_registerTable_ResourceId_FieldLayout_Schema_Schema_stringArray_stringArray.json +1 -1
- package/out/StoreRegistrationSystemLib.sol/_unregisterStoreHook_ResourceId_IStoreHook.json +1 -1
- package/out/System.sol/System.json +1 -1
- package/out/System.t.sol/SystemTest.json +1 -1
- package/out/System.t.sol/TestSystem.json +1 -1
- package/out/Utils.t.sol/UtilsTest.json +1 -1
- package/out/Utils.t.sol/UtilsTestSystem.json +1 -1
- package/out/World.t.sol/EchoSystemHook.json +1 -1
- package/out/World.t.sol/IWorldTestSystem.json +1 -1
- package/out/World.t.sol/PayableFallbackSystem.json +1 -1
- package/out/World.t.sol/RevertSystemHook.json +1 -1
- package/out/World.t.sol/WorldTest.json +1 -1
- package/out/World.t.sol/WorldTestSystem.json +1 -1
- package/out/WorldBalance.t.sol/WorldBalanceTest.json +1 -1
- package/out/WorldBalance.t.sol/WorldBalanceTestSystem.json +1 -1
- package/out/WorldDynamicUpdate.t.sol/UpdateInDynamicFieldTest.json +1 -1
- package/out/WorldFactory.sol/WorldFactory.json +1 -1
- package/out/WorldProxy.sol/WorldProxy.json +1 -1
- package/out/WorldProxy.t.sol/WorldProxyTest.json +1 -1
- package/out/WorldProxyFactory.sol/WorldProxyFactory.json +1 -1
- package/out/WorldProxyFactory.t.sol/WorldProxyFactoryTest.json +1 -1
- package/out/WorldRegistrationSystem.sol/WorldRegistrationSystem.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/WorldRegistrationSystemLib.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerDelegation_address_ResourceId_bytes.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerFunctionSelector_ResourceId_string.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerNamespaceDelegation_ResourceId_ResourceId_bytes.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerNamespace_ResourceId.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerRootFunctionSelector_ResourceId_string_string.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerSystemHook_ResourceId_ISystemHook_uint8.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_registerSystem_ResourceId_System_bool.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_unregisterDelegation_address.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_unregisterNamespaceDelegation_ResourceId.json +1 -1
- package/out/WorldRegistrationSystemLib.sol/_unregisterSystemHook_ResourceId_ISystemHook.json +1 -1
- package/out/build-info/d03362842ce3e334.json +1 -0
- package/package.json +9 -9
- package/src/System.sol +1 -1
- package/out/build-info/6366a746548e984842b93ef762b76b99.json +0 -1
package/dist/internal.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import { Abi, ContractFunctionName, Hex, EncodeFunctionDataParameters, Address, Chain, Account, Client, Transport, WalletActions } from 'viem';
|
2
2
|
import { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from 'abitype';
|
3
|
+
import { SmartAccount, BundlerActions } from 'viem/account-abstraction';
|
3
4
|
export { C as CODEGEN_DEFAULTS, b as CONFIG_DEFAULTS, k as CodegenInput, D as DEPLOY_DEFAULTS, j as DeployInput, M as MODULE_DEFAULTS, i as ModuleInput, N as NamespaceInput, h as NamespacesInput, a as SYSTEM_DEFAULTS, S as SYSTEM_DEPLOY_DEFAULTS, e as SystemDeployInput, f as SystemInput, g as SystemsInput, V as ValidateSystemOptions, W as WorldInput, o as defineNamespaces, t as defineSystem, d as defineWorld, p as requiredSystemKey, r as resolveCodegen, c as resolveDeploy, l as resolveNamespace, y as resolveNamespaceMode, n as resolveNamespaces, s as resolveSystem, w as resolveSystems, z as resolveWorld, v as validateNamespace, m as validateNamespaces, q as validateSystem, u as validateSystems, x as validateWorld } from './world-NqdA4pfW.js';
|
4
5
|
export { C as Codegen, f as Deploy, D as DynamicResolution, M as Module, N as Namespace, e as Namespaces, c as System, S as SystemDeploy, d as Systems, V as ValueWithType, W as World, i as isDynamicResolution, a as isValueWithType, r as resolveTableId, b as resolveWithContext } from './dynamicResolution-Bul4y_B0.js';
|
5
6
|
import '@ark/util';
|
@@ -159,6 +160,19 @@ declare function encodeSystemCalls<abis extends readonly Abi[]>(systemCalls: Sys
|
|
159
160
|
/** Encode system calls to be passed as arguments into `World.batchCallFrom` */
|
160
161
|
declare function encodeSystemCallsFrom<abis extends readonly Abi[]>(from: Address, systemCalls: SystemCalls<abis>): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, "batchCallFrom">["inputs"]>;
|
161
162
|
|
163
|
+
type SystemFunction$1 = {
|
164
|
+
systemId: Hex;
|
165
|
+
systemFunctionSelector: Hex;
|
166
|
+
};
|
167
|
+
|
168
|
+
type CallFromParameters$1 = {
|
169
|
+
worldAddress: Hex;
|
170
|
+
delegatorAddress: Hex;
|
171
|
+
worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction$1>;
|
172
|
+
publicClient?: Client;
|
173
|
+
};
|
174
|
+
declare function callFrom(params: CallFromParameters$1): <chain extends Chain, account extends Account | undefined>(client: Client<Transport, chain, account>) => Pick<WalletActions<chain, account>, "writeContract">;
|
175
|
+
|
162
176
|
type CallFromParameters = {
|
163
177
|
worldAddress: Hex;
|
164
178
|
delegatorAddress: Hex;
|
@@ -169,6 +183,6 @@ type SystemFunction = {
|
|
169
183
|
systemId: Hex;
|
170
184
|
systemFunctionSelector: Hex;
|
171
185
|
};
|
172
|
-
declare function
|
186
|
+
declare function sendUserOperationFrom(params: CallFromParameters): <chain extends Chain, account extends SmartAccount | undefined>(client: Client<Transport, chain, account>) => Pick<BundlerActions<account>, "sendUserOperation">;
|
173
187
|
|
174
|
-
export { type SystemCall, type SystemCallFrom, type SystemCalls, callFrom, encodeSystemCall, encodeSystemCallFrom, encodeSystemCalls, encodeSystemCallsFrom };
|
188
|
+
export { type SystemCall, type SystemCallFrom, type SystemCalls, callFrom, encodeSystemCall, encodeSystemCallFrom, encodeSystemCalls, encodeSystemCallsFrom, sendUserOperationFrom };
|
package/dist/internal.js
CHANGED
@@ -119,57 +119,23 @@ function encodeSystemCallsFrom(from, systemCalls) {
|
|
119
119
|
// ts/actions/callFrom.ts
|
120
120
|
import {
|
121
121
|
slice,
|
122
|
-
concat
|
122
|
+
concat as concat2
|
123
123
|
} from "viem";
|
124
|
-
import { getAction, encodeFunctionData as encodeFunctionData5 } from "viem/utils";
|
125
|
-
import {
|
124
|
+
import { getAction as getAction2, encodeFunctionData as encodeFunctionData5 } from "viem/utils";
|
125
|
+
import { writeContract as viem_writeContract } from "viem/actions";
|
126
126
|
import { readHex } from "@latticexyz/common";
|
127
|
+
|
128
|
+
// ts/worldFunctionToSystemFunction.ts
|
127
129
|
import {
|
130
|
+
getSchemaTypes,
|
128
131
|
getKeySchema,
|
129
132
|
getValueSchema,
|
130
|
-
|
131
|
-
decodeValueArgs
|
132
|
-
encodeKey
|
133
|
+
encodeKey,
|
134
|
+
decodeValueArgs
|
133
135
|
} from "@latticexyz/protocol-parser/internal";
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
const _writeContract = getAction(client, viem_writeContract, "writeContract");
|
138
|
-
if (writeArgs.address !== params.worldAddress || writeArgs.functionName === "call" || writeArgs.functionName === "callFrom" || writeArgs.functionName === "batchCallFrom" || writeArgs.functionName === "callWithSignature") {
|
139
|
-
return _writeContract(writeArgs);
|
140
|
-
}
|
141
|
-
if (writeArgs.functionName === "batchCall") {
|
142
|
-
const batchCallArgs = writeArgs;
|
143
|
-
const [systemCalls] = batchCallArgs.args;
|
144
|
-
if (!systemCalls.length) {
|
145
|
-
throw new Error("`batchCall` should have at least one system call.");
|
146
|
-
}
|
147
|
-
return _writeContract({
|
148
|
-
...batchCallArgs,
|
149
|
-
functionName: "batchCallFrom",
|
150
|
-
args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))]
|
151
|
-
});
|
152
|
-
}
|
153
|
-
const worldCalldata = encodeFunctionData5({
|
154
|
-
abi: writeArgs.abi,
|
155
|
-
functionName: writeArgs.functionName,
|
156
|
-
args: writeArgs.args
|
157
|
-
});
|
158
|
-
const worldFunctionSelector = slice(worldCalldata, 0, 4);
|
159
|
-
const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({
|
160
|
-
...params,
|
161
|
-
publicClient: params.publicClient ?? client,
|
162
|
-
worldFunctionSelector
|
163
|
-
});
|
164
|
-
const systemCalldata = concat([systemFunctionSelector, readHex(worldCalldata, 4)]);
|
165
|
-
return _writeContract({
|
166
|
-
...writeArgs,
|
167
|
-
functionName: "callFrom",
|
168
|
-
args: [params.delegatorAddress, systemId, systemCalldata]
|
169
|
-
});
|
170
|
-
}
|
171
|
-
});
|
172
|
-
}
|
136
|
+
import { concat } from "viem";
|
137
|
+
import { readContract } from "viem/actions";
|
138
|
+
import { getAction } from "viem/utils";
|
173
139
|
var systemFunctionCache = /* @__PURE__ */ new Map();
|
174
140
|
async function worldFunctionToSystemFunction(params) {
|
175
141
|
const cacheKey = concat([params.worldAddress, params.worldFunctionSelector]);
|
@@ -233,6 +199,107 @@ async function retrieveSystemFunctionFromContract(publicClient, worldAddress, wo
|
|
233
199
|
return systemFunction;
|
234
200
|
}
|
235
201
|
|
202
|
+
// ts/actions/callFrom.ts
|
203
|
+
function callFrom(params) {
|
204
|
+
return (client) => ({
|
205
|
+
async writeContract(writeArgs) {
|
206
|
+
const _writeContract = getAction2(client, viem_writeContract, "writeContract");
|
207
|
+
if (writeArgs.address !== params.worldAddress || writeArgs.functionName === "call" || writeArgs.functionName === "callFrom" || writeArgs.functionName === "batchCallFrom" || writeArgs.functionName === "callWithSignature") {
|
208
|
+
return _writeContract(writeArgs);
|
209
|
+
}
|
210
|
+
if (writeArgs.functionName === "batchCall") {
|
211
|
+
const batchCallArgs = writeArgs;
|
212
|
+
const [systemCalls] = batchCallArgs.args;
|
213
|
+
if (!systemCalls.length) {
|
214
|
+
throw new Error("`batchCall` should have at least one system call.");
|
215
|
+
}
|
216
|
+
return _writeContract({
|
217
|
+
...batchCallArgs,
|
218
|
+
functionName: "batchCallFrom",
|
219
|
+
args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))]
|
220
|
+
});
|
221
|
+
}
|
222
|
+
const worldCalldata = encodeFunctionData5({
|
223
|
+
abi: writeArgs.abi,
|
224
|
+
functionName: writeArgs.functionName,
|
225
|
+
args: writeArgs.args
|
226
|
+
});
|
227
|
+
const worldFunctionSelector = slice(worldCalldata, 0, 4);
|
228
|
+
const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({
|
229
|
+
...params,
|
230
|
+
publicClient: params.publicClient ?? client,
|
231
|
+
worldFunctionSelector
|
232
|
+
});
|
233
|
+
const systemCalldata = concat2([systemFunctionSelector, readHex(worldCalldata, 4)]);
|
234
|
+
return _writeContract({
|
235
|
+
...writeArgs,
|
236
|
+
functionName: "callFrom",
|
237
|
+
args: [params.delegatorAddress, systemId, systemCalldata]
|
238
|
+
});
|
239
|
+
}
|
240
|
+
});
|
241
|
+
}
|
242
|
+
|
243
|
+
// ts/actions/sendUserOperationFrom.ts
|
244
|
+
import {
|
245
|
+
slice as slice2,
|
246
|
+
concat as concat3
|
247
|
+
} from "viem";
|
248
|
+
import { getAction as getAction3, encodeFunctionData as encodeFunctionData6 } from "viem/utils";
|
249
|
+
import { readHex as readHex2 } from "@latticexyz/common";
|
250
|
+
import { sendUserOperation as viem_sendUserOperation } from "viem/account-abstraction";
|
251
|
+
function sendUserOperationFrom(params) {
|
252
|
+
return (client) => ({
|
253
|
+
async sendUserOperation(args) {
|
254
|
+
const _sendUserOperation = getAction3(client, viem_sendUserOperation, "sendUserOperation");
|
255
|
+
if (args.callData) {
|
256
|
+
return _sendUserOperation(args);
|
257
|
+
}
|
258
|
+
const calls = await Promise.all(
|
259
|
+
args.calls.map(async (call) => {
|
260
|
+
if (!isDecodedCall(call)) return call;
|
261
|
+
if (call.to !== params.worldAddress || call.functionName === "call" || call.functionName === "callFrom" || call.functionName === "batchCallFrom" || call.functionName === "callWithSignature") {
|
262
|
+
return call;
|
263
|
+
}
|
264
|
+
if (call.functionName === "batchCall") {
|
265
|
+
const batchCallArgs = call.args;
|
266
|
+
const [systemCalls] = batchCallArgs.args;
|
267
|
+
if (!systemCalls.length) {
|
268
|
+
throw new Error("`batchCall` should have at least one system call.");
|
269
|
+
}
|
270
|
+
return {
|
271
|
+
...call,
|
272
|
+
functionName: "batchCallFrom",
|
273
|
+
args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))]
|
274
|
+
};
|
275
|
+
}
|
276
|
+
const worldCalldata = encodeFunctionData6({
|
277
|
+
abi: call.abi,
|
278
|
+
functionName: call.functionName,
|
279
|
+
args: call.args
|
280
|
+
});
|
281
|
+
const worldFunctionSelector = slice2(worldCalldata, 0, 4);
|
282
|
+
const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({
|
283
|
+
...params,
|
284
|
+
publicClient: params.publicClient ?? client,
|
285
|
+
worldFunctionSelector
|
286
|
+
});
|
287
|
+
const systemCalldata = concat3([systemFunctionSelector, readHex2(worldCalldata, 4)]);
|
288
|
+
return {
|
289
|
+
...call,
|
290
|
+
functionName: "callFrom",
|
291
|
+
args: [params.delegatorAddress, systemId, systemCalldata]
|
292
|
+
};
|
293
|
+
})
|
294
|
+
);
|
295
|
+
return _sendUserOperation({ ...args, calls });
|
296
|
+
}
|
297
|
+
});
|
298
|
+
}
|
299
|
+
function isDecodedCall(call) {
|
300
|
+
return typeof call === "object" && call != null && "functionName" in call && "args" in call && "to" in call;
|
301
|
+
}
|
302
|
+
|
236
303
|
// ts/config/v2/dynamicResolution.ts
|
237
304
|
function resolveTableId(tableName) {
|
238
305
|
return {
|
@@ -294,6 +361,7 @@ export {
|
|
294
361
|
resolveTableId,
|
295
362
|
resolveWithContext,
|
296
363
|
resolveWorld,
|
364
|
+
sendUserOperationFrom,
|
297
365
|
validateNamespace,
|
298
366
|
validateNamespaces,
|
299
367
|
validateSystem,
|
package/dist/internal.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../ts/encodeSystemCall.ts","../ts/normalizeSystemFunctionName.ts","../ts/encodeSystemCallFrom.ts","../ts/encodeSystemCalls.ts","../ts/encodeSystemCallsFrom.ts","../ts/actions/callFrom.ts","../ts/config/v2/dynamicResolution.ts"],"sourcesContent":["import { Abi, EncodeFunctionDataParameters, Hex, encodeFunctionData, type ContractFunctionName } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>> = {\n [k in ContractFunctionName<abi>]: {\n /**\n * System's resource ID\n */\n readonly systemId: Hex;\n /**\n * System ABI\n */\n readonly abi: abi;\n /**\n * System function name to call\n */\n readonly functionName: k;\n } & Pick<EncodeFunctionDataParameters<abi, k>, \"args\">;\n}[functionName];\n\n/** Encode a system call to be passed as arguments into `World.call` */\nexport function encodeSystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>>({\n abi,\n systemId,\n functionName,\n args,\n}: SystemCall<abi, functionName>): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"call\">[\"inputs\"]> {\n return [\n systemId,\n encodeFunctionData<abi, functionName>({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n } as EncodeFunctionDataParameters<abi, functionName>),\n ];\n}\n","import { hexToResource, resourceToLabel } from \"@latticexyz/common\";\nimport { Hex } from \"viem\";\n\n/** @internal */\nexport function internal_normalizeSystemFunctionName(systemId: Hex, functionName: string) {\n const resource = hexToResource(systemId);\n const worldFunctionPrefix = resource.namespace !== \"\" ? `${resource.namespace}__` : null;\n if (worldFunctionPrefix != null && functionName.startsWith(worldFunctionPrefix)) {\n console.warn(\n // eslint-disable-next-line max-len\n `Detected world function name \"${functionName}\" used in call to system \"${resourceToLabel(resource)}\".\\n\\nIt's recommended to use a system ABI and system function name with these methods instead.`,\n );\n return functionName.slice(worldFunctionPrefix.length);\n }\n return functionName;\n}\n","import { Abi, EncodeFunctionDataParameters, encodeFunctionData, Address, type ContractFunctionName } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { SystemCall } from \"./encodeSystemCall\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCallFrom<abi extends Abi, functionName extends ContractFunctionName<abi>> = SystemCall<\n abi,\n functionName\n> & {\n readonly from: Address;\n};\n\n/** Encode a system call to be passed as arguments into `World.callFrom` */\nexport function encodeSystemCallFrom<abi extends Abi, functionName extends ContractFunctionName<abi>>({\n abi,\n from,\n systemId,\n functionName,\n args,\n}: SystemCallFrom<abi, functionName>): AbiParametersToPrimitiveTypes<\n ExtractAbiFunction<worldCallAbi, \"callFrom\">[\"inputs\"]\n> {\n return [\n from,\n systemId,\n encodeFunctionData<abi, functionName>({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n } as EncodeFunctionDataParameters<abi, functionName>),\n ];\n}\n","import { Abi, encodeFunctionData, type ContractFunctionName } from \"viem\";\nimport { SystemCall } from \"./encodeSystemCall\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCalls<abis extends readonly Abi[]> = {\n [k in keyof abis]: SystemCall<abis[k], ContractFunctionName<abis[k]>>;\n};\n\n/** Encode system calls to be passed as arguments into `World.batchCall` */\nexport function encodeSystemCalls<abis extends readonly Abi[]>(\n systemCalls: SystemCalls<abis>,\n): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"batchCall\">[\"inputs\"]> {\n return [\n systemCalls.map(({ abi, systemId, functionName, args }) => ({\n systemId,\n callData: encodeFunctionData({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n }),\n })),\n ];\n}\n","import { Abi, Address, encodeFunctionData } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\nimport { SystemCalls } from \"./encodeSystemCalls\";\n\n/** Encode system calls to be passed as arguments into `World.batchCallFrom` */\nexport function encodeSystemCallsFrom<abis extends readonly Abi[]>(\n from: Address,\n systemCalls: SystemCalls<abis>,\n): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"batchCallFrom\">[\"inputs\"]> {\n return [\n systemCalls.map(({ abi, systemId, functionName, args }) => ({\n from,\n systemId,\n callData: encodeFunctionData({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n }),\n })),\n ];\n}\n","import {\n slice,\n concat,\n type Transport,\n type Chain,\n type Account,\n type Hex,\n type WalletActions,\n type Client,\n type PublicActions,\n type WriteContractParameters,\n type EncodeFunctionDataParameters,\n} from \"viem\";\nimport { getAction, encodeFunctionData } from \"viem/utils\";\nimport { readContract, writeContract as viem_writeContract } from \"viem/actions\";\nimport { readHex } from \"@latticexyz/common\";\nimport {\n getKeySchema,\n getValueSchema,\n getSchemaTypes,\n decodeValueArgs,\n encodeKey,\n} from \"@latticexyz/protocol-parser/internal\";\nimport worldConfig from \"../../mud.config\";\nimport { worldCallAbi } from \"../worldCallAbi\";\n\ntype CallFromParameters = {\n worldAddress: Hex;\n delegatorAddress: Hex;\n worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction>;\n publicClient?: Client;\n};\n\ntype SystemFunction = { systemId: Hex; systemFunctionSelector: Hex };\n\n// By extending viem clients with this function after delegation, the delegation is automatically applied to World contract writes.\n// This means that these writes are made on behalf of the delegator.\n// Internally, it transforms the write arguments to use `callFrom`.\n//\n// Accepts either `worldFunctionToSystemFunction` or `publicClient` as an argument.\n// `worldFunctionToSystemFunction` allows manually providing the mapping function, thus users can utilize their client store for the lookup.\n// If `publicClient` is provided instead, this function retrieves the corresponding system function from the World contract.\n//\n// The function mapping is cached to avoid redundant retrievals for the same World function.\nexport function callFrom(\n params: CallFromParameters,\n): <chain extends Chain, account extends Account | undefined>(\n client: Client<Transport, chain, account>,\n) => Pick<WalletActions<chain, account>, \"writeContract\"> {\n return (client) => ({\n async writeContract(writeArgs) {\n const _writeContract = getAction(client, viem_writeContract, \"writeContract\");\n\n // Skip if the contract isn't the World or the function called should not be redirected through `callFrom`.\n if (\n writeArgs.address !== params.worldAddress ||\n writeArgs.functionName === \"call\" ||\n writeArgs.functionName === \"callFrom\" ||\n writeArgs.functionName === \"batchCallFrom\" ||\n writeArgs.functionName === \"callWithSignature\"\n ) {\n return _writeContract(writeArgs);\n }\n\n // Wrap system calls from `batchCall` with delegator for a `batchCallFrom`\n // TODO: remove this specific workaround once https://github.com/latticexyz/mud/pull/3506 lands\n if (writeArgs.functionName === \"batchCall\") {\n const batchCallArgs = writeArgs as unknown as WriteContractParameters<worldCallAbi, \"batchCall\">;\n const [systemCalls] = batchCallArgs.args;\n if (!systemCalls.length) {\n throw new Error(\"`batchCall` should have at least one system call.\");\n }\n\n return _writeContract({\n ...batchCallArgs,\n functionName: \"batchCallFrom\",\n args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))],\n });\n }\n\n // Encode the World's calldata (which includes the World's function selector).\n const worldCalldata = encodeFunctionData({\n abi: writeArgs.abi,\n functionName: writeArgs.functionName,\n args: writeArgs.args,\n } as unknown as EncodeFunctionDataParameters);\n\n // The first 4 bytes of calldata represent the function selector.\n const worldFunctionSelector = slice(worldCalldata, 0, 4);\n\n // Get the systemId and System's function selector.\n const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({\n ...params,\n publicClient: params.publicClient ?? client,\n worldFunctionSelector,\n });\n\n // Construct the System's calldata by replacing the World's function selector with the System's.\n // Use `readHex` instead of `slice` to prevent out-of-bounds errors with calldata that has no args.\n const systemCalldata = concat([systemFunctionSelector, readHex(worldCalldata, 4)]);\n\n // Call `writeContract` with the new args.\n return _writeContract({\n ...(writeArgs as unknown as WriteContractParameters<worldCallAbi, \"callFrom\">),\n functionName: \"callFrom\",\n args: [params.delegatorAddress, systemId, systemCalldata],\n });\n },\n });\n}\n\nconst systemFunctionCache = new Map<Hex, SystemFunction>();\n\nasync function worldFunctionToSystemFunction(params: {\n worldAddress: Hex;\n delegatorAddress: Hex;\n worldFunctionSelector: Hex;\n worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction>;\n publicClient: Client;\n}): Promise<SystemFunction> {\n const cacheKey = concat([params.worldAddress, params.worldFunctionSelector]);\n\n // Use cache if the function has been called previously.\n const cached = systemFunctionCache.get(cacheKey);\n if (cached) return cached;\n\n // If a mapping function is provided, use it. Otherwise, call the World contract.\n const systemFunction = params.worldFunctionToSystemFunction\n ? await params.worldFunctionToSystemFunction(params.worldFunctionSelector)\n : await retrieveSystemFunctionFromContract(params.publicClient, params.worldAddress, params.worldFunctionSelector);\n\n systemFunctionCache.set(cacheKey, systemFunction);\n\n return systemFunction;\n}\n\nasync function retrieveSystemFunctionFromContract(\n publicClient: Client,\n worldAddress: Hex,\n worldFunctionSelector: Hex,\n): Promise<SystemFunction> {\n const table = worldConfig.tables.world__FunctionSelectors;\n\n const keySchema = getSchemaTypes(getKeySchema(table));\n const valueSchema = getSchemaTypes(getValueSchema(table));\n\n const _readContract = getAction(publicClient, readContract, \"readContract\") as PublicActions[\"readContract\"];\n\n const [staticData, encodedLengths, dynamicData] = await _readContract({\n address: worldAddress,\n abi: [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n ],\n functionName: \"getRecord\",\n args: [table.tableId, encodeKey(keySchema, { worldFunctionSelector })],\n });\n\n const decoded = decodeValueArgs(valueSchema, { staticData, encodedLengths, dynamicData });\n\n const systemFunction: SystemFunction = {\n systemId: decoded.systemId,\n systemFunctionSelector: decoded.systemFunctionSelector,\n };\n\n return systemFunction;\n}\n","import { World } from \"./output\";\n\nexport type DynamicResolution = {\n // TODO: add systemAddress support\n type: \"tableId\";\n input: string;\n};\n\nexport type ValueWithType = {\n value: string | number | Uint8Array;\n type: string;\n};\n\n/**\n * Dynamically resolve a table name to a table id at deploy time\n */\nexport function resolveTableId(tableName: string) {\n return {\n type: \"tableId\",\n input: tableName,\n } as const;\n}\n\n/** Type guard for DynamicResolution */\nexport function isDynamicResolution(value: unknown): value is DynamicResolution {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"input\" in value;\n}\n\n/** Type guard for ValueWithType */\nexport function isValueWithType(value: unknown): value is ValueWithType {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"value\" in value;\n}\n\n/**\n * Turn a DynamicResolution object into a ValueWithType based on the provided context\n */\nexport function resolveWithContext(\n input: unknown,\n context: { config: World; systemAddresses?: Record<string, Promise<string>> },\n): ValueWithType {\n if (isValueWithType(input)) return input;\n\n if (isDynamicResolution(input)) {\n if (input.type === \"tableId\") {\n const tableEntries = Object.entries(context.config.tables).filter(\n ([tableName, table]) => tableName === input.input || table.name === input.input,\n );\n\n if (tableEntries.length > 1) {\n throw new Error(\n `Found more than one table with name \"${input.input}\". Try using one of the following table names instead: ${tableEntries.map(([tableName]) => tableName).join(\", \")}`,\n );\n }\n\n if (tableEntries.length === 1) {\n const [entry] = tableEntries;\n const [, table] = entry;\n return { type: \"bytes32\", value: table.tableId };\n }\n }\n }\n\n throw new Error(`Could not resolve dynamic resolution:\\n${JSON.stringify(input, null, 2)}`);\n}\n"],"mappings":"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","names":["encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData"]}
|
1
|
+
{"version":3,"sources":["../ts/encodeSystemCall.ts","../ts/normalizeSystemFunctionName.ts","../ts/encodeSystemCallFrom.ts","../ts/encodeSystemCalls.ts","../ts/encodeSystemCallsFrom.ts","../ts/actions/callFrom.ts","../ts/worldFunctionToSystemFunction.ts","../ts/actions/sendUserOperationFrom.ts","../ts/config/v2/dynamicResolution.ts"],"sourcesContent":["import { Abi, EncodeFunctionDataParameters, Hex, encodeFunctionData, type ContractFunctionName } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>> = {\n [k in ContractFunctionName<abi>]: {\n /**\n * System's resource ID\n */\n readonly systemId: Hex;\n /**\n * System ABI\n */\n readonly abi: abi;\n /**\n * System function name to call\n */\n readonly functionName: k;\n } & Pick<EncodeFunctionDataParameters<abi, k>, \"args\">;\n}[functionName];\n\n/** Encode a system call to be passed as arguments into `World.call` */\nexport function encodeSystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>>({\n abi,\n systemId,\n functionName,\n args,\n}: SystemCall<abi, functionName>): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"call\">[\"inputs\"]> {\n return [\n systemId,\n encodeFunctionData<abi, functionName>({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n } as EncodeFunctionDataParameters<abi, functionName>),\n ];\n}\n","import { hexToResource, resourceToLabel } from \"@latticexyz/common\";\nimport { Hex } from \"viem\";\n\n/** @internal */\nexport function internal_normalizeSystemFunctionName(systemId: Hex, functionName: string) {\n const resource = hexToResource(systemId);\n const worldFunctionPrefix = resource.namespace !== \"\" ? `${resource.namespace}__` : null;\n if (worldFunctionPrefix != null && functionName.startsWith(worldFunctionPrefix)) {\n console.warn(\n // eslint-disable-next-line max-len\n `Detected world function name \"${functionName}\" used in call to system \"${resourceToLabel(resource)}\".\\n\\nIt's recommended to use a system ABI and system function name with these methods instead.`,\n );\n return functionName.slice(worldFunctionPrefix.length);\n }\n return functionName;\n}\n","import { Abi, EncodeFunctionDataParameters, encodeFunctionData, Address, type ContractFunctionName } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { SystemCall } from \"./encodeSystemCall\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCallFrom<abi extends Abi, functionName extends ContractFunctionName<abi>> = SystemCall<\n abi,\n functionName\n> & {\n readonly from: Address;\n};\n\n/** Encode a system call to be passed as arguments into `World.callFrom` */\nexport function encodeSystemCallFrom<abi extends Abi, functionName extends ContractFunctionName<abi>>({\n abi,\n from,\n systemId,\n functionName,\n args,\n}: SystemCallFrom<abi, functionName>): AbiParametersToPrimitiveTypes<\n ExtractAbiFunction<worldCallAbi, \"callFrom\">[\"inputs\"]\n> {\n return [\n from,\n systemId,\n encodeFunctionData<abi, functionName>({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n } as EncodeFunctionDataParameters<abi, functionName>),\n ];\n}\n","import { Abi, encodeFunctionData, type ContractFunctionName } from \"viem\";\nimport { SystemCall } from \"./encodeSystemCall\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\n\nexport type SystemCalls<abis extends readonly Abi[]> = {\n [k in keyof abis]: SystemCall<abis[k], ContractFunctionName<abis[k]>>;\n};\n\n/** Encode system calls to be passed as arguments into `World.batchCall` */\nexport function encodeSystemCalls<abis extends readonly Abi[]>(\n systemCalls: SystemCalls<abis>,\n): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"batchCall\">[\"inputs\"]> {\n return [\n systemCalls.map(({ abi, systemId, functionName, args }) => ({\n systemId,\n callData: encodeFunctionData({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n }),\n })),\n ];\n}\n","import { Abi, Address, encodeFunctionData } from \"viem\";\nimport type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from \"abitype\";\nimport { worldCallAbi } from \"./worldCallAbi\";\nimport { internal_normalizeSystemFunctionName } from \"./normalizeSystemFunctionName\";\nimport { SystemCalls } from \"./encodeSystemCalls\";\n\n/** Encode system calls to be passed as arguments into `World.batchCallFrom` */\nexport function encodeSystemCallsFrom<abis extends readonly Abi[]>(\n from: Address,\n systemCalls: SystemCalls<abis>,\n): AbiParametersToPrimitiveTypes<ExtractAbiFunction<worldCallAbi, \"batchCallFrom\">[\"inputs\"]> {\n return [\n systemCalls.map(({ abi, systemId, functionName, args }) => ({\n from,\n systemId,\n callData: encodeFunctionData({\n abi,\n functionName: internal_normalizeSystemFunctionName(systemId, functionName),\n args,\n }),\n })),\n ];\n}\n","import {\n slice,\n concat,\n type Transport,\n type Chain,\n type Account,\n type Hex,\n type WalletActions,\n type Client,\n type WriteContractParameters,\n type EncodeFunctionDataParameters,\n} from \"viem\";\nimport { getAction, encodeFunctionData } from \"viem/utils\";\nimport { writeContract as viem_writeContract } from \"viem/actions\";\nimport { readHex } from \"@latticexyz/common\";\nimport { worldCallAbi } from \"../worldCallAbi\";\nimport { SystemFunction, worldFunctionToSystemFunction } from \"../worldFunctionToSystemFunction\";\n\ntype CallFromParameters = {\n worldAddress: Hex;\n delegatorAddress: Hex;\n worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction>;\n publicClient?: Client;\n};\n\n// By extending viem clients with this function after delegation, the delegation is automatically applied to World contract writes.\n// This means that these writes are made on behalf of the delegator.\n// Internally, it transforms the write arguments to use `callFrom`.\n//\n// Accepts either `worldFunctionToSystemFunction` or `publicClient` as an argument.\n// `worldFunctionToSystemFunction` allows manually providing the mapping function, thus users can utilize their client store for the lookup.\n// If `publicClient` is provided instead, this function retrieves the corresponding system function from the World contract.\n//\n// The function mapping is cached to avoid redundant retrievals for the same World function.\nexport function callFrom(\n params: CallFromParameters,\n): <chain extends Chain, account extends Account | undefined>(\n client: Client<Transport, chain, account>,\n) => Pick<WalletActions<chain, account>, \"writeContract\"> {\n return (client) => ({\n async writeContract(writeArgs) {\n const _writeContract = getAction(client, viem_writeContract, \"writeContract\");\n\n // Skip if the contract isn't the World or the function called should not be redirected through `callFrom`.\n if (\n writeArgs.address !== params.worldAddress ||\n writeArgs.functionName === \"call\" ||\n writeArgs.functionName === \"callFrom\" ||\n writeArgs.functionName === \"batchCallFrom\" ||\n writeArgs.functionName === \"callWithSignature\"\n ) {\n return _writeContract(writeArgs);\n }\n\n // Wrap system calls from `batchCall` with delegator for a `batchCallFrom`\n // TODO: remove this specific workaround once https://github.com/latticexyz/mud/pull/3506 lands\n if (writeArgs.functionName === \"batchCall\") {\n const batchCallArgs = writeArgs as unknown as WriteContractParameters<worldCallAbi, \"batchCall\">;\n const [systemCalls] = batchCallArgs.args;\n if (!systemCalls.length) {\n throw new Error(\"`batchCall` should have at least one system call.\");\n }\n\n return _writeContract({\n ...batchCallArgs,\n functionName: \"batchCallFrom\",\n args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))],\n });\n }\n\n // Encode the World's calldata (which includes the World's function selector).\n const worldCalldata = encodeFunctionData({\n abi: writeArgs.abi,\n functionName: writeArgs.functionName,\n args: writeArgs.args,\n } as unknown as EncodeFunctionDataParameters);\n\n // The first 4 bytes of calldata represent the function selector.\n const worldFunctionSelector = slice(worldCalldata, 0, 4);\n\n // Get the systemId and System's function selector.\n const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({\n ...params,\n publicClient: params.publicClient ?? client,\n worldFunctionSelector,\n });\n\n // Construct the System's calldata by replacing the World's function selector with the System's.\n // Use `readHex` instead of `slice` to prevent out-of-bounds errors with calldata that has no args.\n const systemCalldata = concat([systemFunctionSelector, readHex(worldCalldata, 4)]);\n\n // Call `writeContract` with the new args.\n return _writeContract({\n ...(writeArgs as unknown as WriteContractParameters<worldCallAbi, \"callFrom\">),\n functionName: \"callFrom\",\n args: [params.delegatorAddress, systemId, systemCalldata],\n });\n },\n });\n}\n","import {\n getSchemaTypes,\n getKeySchema,\n getValueSchema,\n encodeKey,\n decodeValueArgs,\n} from \"@latticexyz/protocol-parser/internal\";\nimport { Client, concat, Hex, PublicActions } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getAction } from \"viem/utils\";\nimport worldConfig from \"../mud.config\";\n\nexport type SystemFunction = { systemId: Hex; systemFunctionSelector: Hex };\n\nconst systemFunctionCache = new Map<Hex, SystemFunction>();\n\nexport async function worldFunctionToSystemFunction(params: {\n worldAddress: Hex;\n delegatorAddress: Hex;\n worldFunctionSelector: Hex;\n worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction>;\n publicClient: Client;\n}): Promise<SystemFunction> {\n const cacheKey = concat([params.worldAddress, params.worldFunctionSelector]);\n\n // Use cache if the function has been called previously.\n const cached = systemFunctionCache.get(cacheKey);\n if (cached) return cached;\n\n // If a mapping function is provided, use it. Otherwise, call the World contract.\n const systemFunction = params.worldFunctionToSystemFunction\n ? await params.worldFunctionToSystemFunction(params.worldFunctionSelector)\n : await retrieveSystemFunctionFromContract(params.publicClient, params.worldAddress, params.worldFunctionSelector);\n\n systemFunctionCache.set(cacheKey, systemFunction);\n\n return systemFunction;\n}\n\nasync function retrieveSystemFunctionFromContract(\n publicClient: Client,\n worldAddress: Hex,\n worldFunctionSelector: Hex,\n): Promise<SystemFunction> {\n const table = worldConfig.tables.world__FunctionSelectors;\n\n const keySchema = getSchemaTypes(getKeySchema(table));\n const valueSchema = getSchemaTypes(getValueSchema(table));\n\n const _readContract = getAction(publicClient, readContract, \"readContract\") as PublicActions[\"readContract\"];\n\n const [staticData, encodedLengths, dynamicData] = await _readContract({\n address: worldAddress,\n abi: [\n {\n type: \"function\",\n name: \"getRecord\",\n inputs: [\n {\n name: \"tableId\",\n type: \"bytes32\",\n internalType: \"ResourceId\",\n },\n {\n name: \"keyTuple\",\n type: \"bytes32[]\",\n internalType: \"bytes32[]\",\n },\n ],\n outputs: [\n {\n name: \"staticData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n {\n name: \"encodedLengths\",\n type: \"bytes32\",\n internalType: \"EncodedLengths\",\n },\n {\n name: \"dynamicData\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n },\n ],\n functionName: \"getRecord\",\n args: [table.tableId, encodeKey(keySchema, { worldFunctionSelector })],\n });\n\n const decoded = decodeValueArgs(valueSchema, { staticData, encodedLengths, dynamicData });\n\n const systemFunction: SystemFunction = {\n systemId: decoded.systemId,\n systemFunctionSelector: decoded.systemFunctionSelector,\n };\n\n return systemFunction;\n}\n","import {\n slice,\n concat,\n type Transport,\n type Chain,\n type Hex,\n type Client,\n type EncodeFunctionDataParameters,\n Abi,\n WriteContractParameters,\n} from \"viem\";\nimport { getAction, encodeFunctionData } from \"viem/utils\";\nimport { readHex } from \"@latticexyz/common\";\nimport { BundlerActions, sendUserOperation as viem_sendUserOperation, SmartAccount } from \"viem/account-abstraction\";\nimport { worldFunctionToSystemFunction } from \"../worldFunctionToSystemFunction\";\nimport { worldCallAbi } from \"../worldCallAbi\";\n\ntype CallFromParameters = {\n worldAddress: Hex;\n delegatorAddress: Hex;\n worldFunctionToSystemFunction?: (worldFunctionSelector: Hex) => Promise<SystemFunction>;\n publicClient?: Client;\n};\n\ntype SystemFunction = { systemId: Hex; systemFunctionSelector: Hex };\n\n// By extending viem clients with this function after delegation, the delegation is automatically applied to World contract writes.\n// This means that these writes are made on behalf of the delegator.\n// Internally, it transforms the write arguments to use `callFrom`.\n//\n// Accepts either `worldFunctionToSystemFunction` or `publicClient` as an argument.\n// `worldFunctionToSystemFunction` allows manually providing the mapping function, thus users can utilize their client store for the lookup.\n// If `publicClient` is provided instead, this function retrieves the corresponding system function from the World contract.\n//\n// The function mapping is cached to avoid redundant retrievals for the same World function.\nexport function sendUserOperationFrom(\n params: CallFromParameters,\n): <chain extends Chain, account extends SmartAccount | undefined>(\n client: Client<Transport, chain, account>,\n) => Pick<BundlerActions<account>, \"sendUserOperation\"> {\n return (client) => ({\n async sendUserOperation(args) {\n const _sendUserOperation = getAction(client, viem_sendUserOperation, \"sendUserOperation\");\n\n if (args.callData) {\n return _sendUserOperation(args as never); // TODO: fix type issue\n }\n\n const calls = await Promise.all(\n args.calls.map(async (call) => {\n // Skip if the call doesn't match the decoded format (`functionName`, `args`, `to`)\n if (!isDecodedCall(call)) return call;\n\n // Skip if the contract isn't the World or the function called should not be redirected through `callFrom`.\n if (\n call.to !== params.worldAddress ||\n call.functionName === \"call\" ||\n call.functionName === \"callFrom\" ||\n call.functionName === \"batchCallFrom\" ||\n call.functionName === \"callWithSignature\"\n ) {\n return call;\n }\n\n // Wrap system calls from `batchCall` with delegator for a `batchCallFrom`\n // TODO: remove this specific workaround once https://github.com/latticexyz/mud/pull/3506 lands\n if (call.functionName === \"batchCall\") {\n const batchCallArgs = call.args as unknown as WriteContractParameters<worldCallAbi, \"batchCall\">;\n const [systemCalls] = batchCallArgs.args;\n if (!systemCalls.length) {\n throw new Error(\"`batchCall` should have at least one system call.\");\n }\n\n return {\n ...call,\n functionName: \"batchCallFrom\",\n args: [systemCalls.map((systemCall) => ({ from: params.delegatorAddress, ...systemCall }))],\n };\n }\n\n // Encode the World's calldata (which includes the World's function selector).\n const worldCalldata = encodeFunctionData({\n abi: call.abi,\n functionName: call.functionName,\n args: call.args,\n } as unknown as EncodeFunctionDataParameters);\n\n // The first 4 bytes of calldata represent the function selector.\n const worldFunctionSelector = slice(worldCalldata, 0, 4);\n\n // Get the systemId and System's function selector.\n const { systemId, systemFunctionSelector } = await worldFunctionToSystemFunction({\n ...params,\n publicClient: params.publicClient ?? client,\n worldFunctionSelector,\n });\n\n // Construct the System's calldata by replacing the World's function selector with the System's.\n // Use `readHex` instead of `slice` to prevent out-of-bounds errors with calldata that has no args.\n const systemCalldata = concat([systemFunctionSelector, readHex(worldCalldata, 4)]);\n\n return {\n ...call,\n functionName: \"callFrom\",\n args: [params.delegatorAddress, systemId, systemCalldata],\n };\n }),\n );\n\n // Call `sendUserOperation` with the new args.\n return _sendUserOperation({ ...args, calls } as never); // TODO: fix type issue\n },\n });\n}\n\n// Matching https://github.com/wevm/viem/blob/26e4bcafb3be976510b4d8170ef29bb69e014263/src/types/calls.ts#L6-L23 (not exported)\ntype DecodedCall = {\n abi: Abi;\n functionName: string;\n args: unknown[];\n to: Hex;\n};\n\nfunction isDecodedCall(call: unknown): call is DecodedCall {\n return typeof call === \"object\" && call != null && \"functionName\" in call && \"args\" in call && \"to\" in call;\n}\n","import { World } from \"./output\";\n\nexport type DynamicResolution = {\n // TODO: add systemAddress support\n type: \"tableId\";\n input: string;\n};\n\nexport type ValueWithType = {\n value: string | number | Uint8Array;\n type: string;\n};\n\n/**\n * Dynamically resolve a table name to a table id at deploy time\n */\nexport function resolveTableId(tableName: string) {\n return {\n type: \"tableId\",\n input: tableName,\n } as const;\n}\n\n/** Type guard for DynamicResolution */\nexport function isDynamicResolution(value: unknown): value is DynamicResolution {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"input\" in value;\n}\n\n/** Type guard for ValueWithType */\nexport function isValueWithType(value: unknown): value is ValueWithType {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"value\" in value;\n}\n\n/**\n * Turn a DynamicResolution object into a ValueWithType based on the provided context\n */\nexport function resolveWithContext(\n input: unknown,\n context: { config: World; systemAddresses?: Record<string, Promise<string>> },\n): ValueWithType {\n if (isValueWithType(input)) return input;\n\n if (isDynamicResolution(input)) {\n if (input.type === \"tableId\") {\n const tableEntries = Object.entries(context.config.tables).filter(\n ([tableName, table]) => tableName === input.input || table.name === input.input,\n );\n\n if (tableEntries.length > 1) {\n throw new Error(\n `Found more than one table with name \"${input.input}\". Try using one of the following table names instead: ${tableEntries.map(([tableName]) => tableName).join(\", \")}`,\n );\n }\n\n if (tableEntries.length === 1) {\n const [entry] = tableEntries;\n const [, table] = entry;\n return { type: \"bytes32\", value: table.tableId };\n }\n }\n }\n\n throw new Error(`Could not resolve dynamic resolution:\\n${JSON.stringify(input, null, 2)}`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAiD,0BAAqD;;;ACAtG,SAAS,eAAe,uBAAuB;AAIxC,SAAS,qCAAqC,UAAe,cAAsB;AACxF,QAAM,WAAW,cAAc,QAAQ;AACvC,QAAM,sBAAsB,SAAS,cAAc,KAAK,GAAG,SAAS,SAAS,OAAO;AACpF,MAAI,uBAAuB,QAAQ,aAAa,WAAW,mBAAmB,GAAG;AAC/E,YAAQ;AAAA;AAAA,MAEN,iCAAiC,YAAY,6BAA6B,gBAAgB,QAAQ,CAAC;AAAA;AAAA;AAAA,IACrG;AACA,WAAO,aAAa,MAAM,oBAAoB,MAAM;AAAA,EACtD;AACA,SAAO;AACT;;;ADQO,SAAS,iBAAkF;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqH;AACnH,SAAO;AAAA,IACL;AAAA,IACA,mBAAsC;AAAA,MACpC;AAAA,MACA,cAAc,qCAAqC,UAAU,YAAY;AAAA,MACzE;AAAA,IACF,CAAoD;AAAA,EACtD;AACF;;;AErCA,SAA4C,sBAAAA,2BAA8D;AAcnG,SAAS,qBAAsF;AAAA,EACpG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEE;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACAC,oBAAsC;AAAA,MACpC;AAAA,MACA,cAAc,qCAAqC,UAAU,YAAY;AAAA,MACzE;AAAA,IACF,CAAoD;AAAA,EACtD;AACF;;;AChCA,SAAc,sBAAAC,2BAAqD;AAW5D,SAAS,kBACd,aACwF;AACxF,SAAO;AAAA,IACL,YAAY,IAAI,CAAC,EAAE,KAAK,UAAU,cAAc,KAAK,OAAO;AAAA,MAC1D;AAAA,MACA,UAAUC,oBAAmB;AAAA,QAC3B;AAAA,QACA,cAAc,qCAAqC,UAAU,YAAY;AAAA,QACzE;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAAA,EACJ;AACF;;;ACxBA,SAAuB,sBAAAC,2BAA0B;AAO1C,SAAS,sBACd,MACA,aAC4F;AAC5F,SAAO;AAAA,IACL,YAAY,IAAI,CAAC,EAAE,KAAK,UAAU,cAAc,KAAK,OAAO;AAAA,MAC1D;AAAA,MACA;AAAA,MACA,UAAUC,oBAAmB;AAAA,QAC3B;AAAA,QACA,cAAc,qCAAqC,UAAU,YAAY;AAAA,QACzE;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAAA,EACJ;AACF;;;ACtBA;AAAA,EACE;AAAA,EACA,UAAAC;AAAA,OASK;AACP,SAAS,aAAAC,YAAW,sBAAAC,2BAA0B;AAC9C,SAAS,iBAAiB,0BAA0B;AACpD,SAAS,eAAe;;;ACdxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAiB,cAAkC;AACnD,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAK1B,IAAM,sBAAsB,oBAAI,IAAyB;AAEzD,eAAsB,8BAA8B,QAMxB;AAC1B,QAAM,WAAW,OAAO,CAAC,OAAO,cAAc,OAAO,qBAAqB,CAAC;AAG3E,QAAM,SAAS,oBAAoB,IAAI,QAAQ;AAC/C,MAAI,OAAQ,QAAO;AAGnB,QAAM,iBAAiB,OAAO,gCAC1B,MAAM,OAAO,8BAA8B,OAAO,qBAAqB,IACvE,MAAM,mCAAmC,OAAO,cAAc,OAAO,cAAc,OAAO,qBAAqB;AAEnH,sBAAoB,IAAI,UAAU,cAAc;AAEhD,SAAO;AACT;AAEA,eAAe,mCACb,cACA,cACA,uBACyB;AACzB,QAAM,QAAQ,mBAAY,OAAO;AAEjC,QAAM,YAAY,eAAe,aAAa,KAAK,CAAC;AACpD,QAAM,cAAc,eAAe,eAAe,KAAK,CAAC;AAExD,QAAM,gBAAgB,UAAU,cAAc,cAAc,cAAc;AAE1E,QAAM,CAAC,YAAY,gBAAgB,WAAW,IAAI,MAAM,cAAc;AAAA,IACpE,SAAS;AAAA,IACT,KAAK;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,UAChB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,UAChB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,UAChB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,SAAS,UAAU,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAAA,EACvE,CAAC;AAED,QAAM,UAAU,gBAAgB,aAAa,EAAE,YAAY,gBAAgB,YAAY,CAAC;AAExF,QAAM,iBAAiC;AAAA,IACrC,UAAU,QAAQ;AAAA,IAClB,wBAAwB,QAAQ;AAAA,EAClC;AAEA,SAAO;AACT;;;ADnEO,SAAS,SACd,QAGwD;AACxD,SAAO,CAAC,YAAY;AAAA,IAClB,MAAM,cAAc,WAAW;AAC7B,YAAM,iBAAiBC,WAAU,QAAQ,oBAAoB,eAAe;AAG5E,UACE,UAAU,YAAY,OAAO,gBAC7B,UAAU,iBAAiB,UAC3B,UAAU,iBAAiB,cAC3B,UAAU,iBAAiB,mBAC3B,UAAU,iBAAiB,qBAC3B;AACA,eAAO,eAAe,SAAS;AAAA,MACjC;AAIA,UAAI,UAAU,iBAAiB,aAAa;AAC1C,cAAM,gBAAgB;AACtB,cAAM,CAAC,WAAW,IAAI,cAAc;AACpC,YAAI,CAAC,YAAY,QAAQ;AACvB,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AAEA,eAAO,eAAe;AAAA,UACpB,GAAG;AAAA,UACH,cAAc;AAAA,UACd,MAAM,CAAC,YAAY,IAAI,CAAC,gBAAgB,EAAE,MAAM,OAAO,kBAAkB,GAAG,WAAW,EAAE,CAAC;AAAA,QAC5F,CAAC;AAAA,MACH;AAGA,YAAM,gBAAgBC,oBAAmB;AAAA,QACvC,KAAK,UAAU;AAAA,QACf,cAAc,UAAU;AAAA,QACxB,MAAM,UAAU;AAAA,MAClB,CAA4C;AAG5C,YAAM,wBAAwB,MAAM,eAAe,GAAG,CAAC;AAGvD,YAAM,EAAE,UAAU,uBAAuB,IAAI,MAAM,8BAA8B;AAAA,QAC/E,GAAG;AAAA,QACH,cAAc,OAAO,gBAAgB;AAAA,QACrC;AAAA,MACF,CAAC;AAID,YAAM,iBAAiBC,QAAO,CAAC,wBAAwB,QAAQ,eAAe,CAAC,CAAC,CAAC;AAGjF,aAAO,eAAe;AAAA,QACpB,GAAI;AAAA,QACJ,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,kBAAkB,UAAU,cAAc;AAAA,MAC1D,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AEnGA;AAAA,EACE,SAAAC;AAAA,EACA,UAAAC;AAAA,OAQK;AACP,SAAS,aAAAC,YAAW,sBAAAC,2BAA0B;AAC9C,SAAS,WAAAC,gBAAe;AACxB,SAAyB,qBAAqB,8BAA4C;AAsBnF,SAAS,sBACd,QAGsD;AACtD,SAAO,CAAC,YAAY;AAAA,IAClB,MAAM,kBAAkB,MAAM;AAC5B,YAAM,qBAAqBC,WAAU,QAAQ,wBAAwB,mBAAmB;AAExF,UAAI,KAAK,UAAU;AACjB,eAAO,mBAAmB,IAAa;AAAA,MACzC;AAEA,YAAM,QAAQ,MAAM,QAAQ;AAAA,QAC1B,KAAK,MAAM,IAAI,OAAO,SAAS;AAE7B,cAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AAGjC,cACE,KAAK,OAAO,OAAO,gBACnB,KAAK,iBAAiB,UACtB,KAAK,iBAAiB,cACtB,KAAK,iBAAiB,mBACtB,KAAK,iBAAiB,qBACtB;AACA,mBAAO;AAAA,UACT;AAIA,cAAI,KAAK,iBAAiB,aAAa;AACrC,kBAAM,gBAAgB,KAAK;AAC3B,kBAAM,CAAC,WAAW,IAAI,cAAc;AACpC,gBAAI,CAAC,YAAY,QAAQ;AACvB,oBAAM,IAAI,MAAM,mDAAmD;AAAA,YACrE;AAEA,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,cAAc;AAAA,cACd,MAAM,CAAC,YAAY,IAAI,CAAC,gBAAgB,EAAE,MAAM,OAAO,kBAAkB,GAAG,WAAW,EAAE,CAAC;AAAA,YAC5F;AAAA,UACF;AAGA,gBAAM,gBAAgBC,oBAAmB;AAAA,YACvC,KAAK,KAAK;AAAA,YACV,cAAc,KAAK;AAAA,YACnB,MAAM,KAAK;AAAA,UACb,CAA4C;AAG5C,gBAAM,wBAAwBC,OAAM,eAAe,GAAG,CAAC;AAGvD,gBAAM,EAAE,UAAU,uBAAuB,IAAI,MAAM,8BAA8B;AAAA,YAC/E,GAAG;AAAA,YACH,cAAc,OAAO,gBAAgB;AAAA,YACrC;AAAA,UACF,CAAC;AAID,gBAAM,iBAAiBC,QAAO,CAAC,wBAAwBC,SAAQ,eAAe,CAAC,CAAC,CAAC;AAEjF,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,cAAc;AAAA,YACd,MAAM,CAAC,OAAO,kBAAkB,UAAU,cAAc;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MACH;AAGA,aAAO,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAU;AAAA,IACvD;AAAA,EACF;AACF;AAUA,SAAS,cAAc,MAAoC;AACzD,SAAO,OAAO,SAAS,YAAY,QAAQ,QAAQ,kBAAkB,QAAQ,UAAU,QAAQ,QAAQ;AACzG;;;AC7GO,SAAS,eAAe,WAAmB;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAGO,SAAS,oBAAoB,OAA4C;AAC9E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,WAAW;AACtF;AAGO,SAAS,gBAAgB,OAAwC;AACtE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,WAAW;AACtF;AAKO,SAAS,mBACd,OACA,SACe;AACf,MAAI,gBAAgB,KAAK,EAAG,QAAO;AAEnC,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,eAAe,OAAO,QAAQ,QAAQ,OAAO,MAAM,EAAE;AAAA,QACzD,CAAC,CAAC,WAAW,KAAK,MAAM,cAAc,MAAM,SAAS,MAAM,SAAS,MAAM;AAAA,MAC5E;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,IAAI;AAAA,UACR,wCAAwC,MAAM,KAAK,0DAA0D,aAAa,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,QACtK;AAAA,MACF;AAEA,UAAI,aAAa,WAAW,GAAG;AAC7B,cAAM,CAAC,KAAK,IAAI;AAChB,cAAM,CAAC,EAAE,KAAK,IAAI;AAClB,eAAO,EAAE,MAAM,WAAW,OAAO,MAAM,QAAQ;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM;AAAA,EAA0C,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC,EAAE;AAC5F;","names":["encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","encodeFunctionData","concat","getAction","encodeFunctionData","getAction","encodeFunctionData","concat","slice","concat","getAction","encodeFunctionData","readHex","getAction","encodeFunctionData","slice","concat","readHex"]}
|
package/dist/node.js
CHANGED
@@ -258,6 +258,7 @@ import {
|
|
258
258
|
renderedSolidityHeader as renderedSolidityHeader2,
|
259
259
|
renderImports as renderImports2
|
260
260
|
} from "@latticexyz/common/codegen";
|
261
|
+
import { stringToHex } from "viem";
|
261
262
|
function renderSystemLibrary(options) {
|
262
263
|
const {
|
263
264
|
imports: systemImports,
|
@@ -273,6 +274,9 @@ function renderSystemLibrary(options) {
|
|
273
274
|
} = options;
|
274
275
|
const functions = functionsInput.map((func) => ({
|
275
276
|
...func,
|
277
|
+
// Format parameters (add auxiliary argument names, replace calldata location)
|
278
|
+
parameters: formatParams(func.parameters),
|
279
|
+
// Remove `payable` from stateMutability for library functions
|
276
280
|
stateMutability: func.stateMutability.replace("payable", "")
|
277
281
|
}));
|
278
282
|
const imports = [
|
@@ -394,7 +398,7 @@ function renderErrors(errors) {
|
|
394
398
|
}
|
395
399
|
function renderUserTypeFunction(contractFunction, userTypeName) {
|
396
400
|
const { name, parameters, stateMutability, returnParameters } = contractFunction;
|
397
|
-
const args = [`${userTypeName} self`, ...parameters]
|
401
|
+
const args = [`${userTypeName} self`, ...parameters];
|
398
402
|
const functionSignature = `
|
399
403
|
function ${name}(
|
400
404
|
${renderArguments2(args)}
|
@@ -411,7 +415,7 @@ function renderUserTypeFunction(contractFunction, userTypeName) {
|
|
411
415
|
}
|
412
416
|
function renderCallWrapperFunction(contractFunction, callingFromRootSystemErrorName) {
|
413
417
|
const { name, parameters, stateMutability, returnParameters } = contractFunction;
|
414
|
-
const args = [`CallWrapper memory self`, ...parameters]
|
418
|
+
const args = [`CallWrapper memory self`, ...parameters];
|
415
419
|
const functionSignature = `
|
416
420
|
function ${name}(
|
417
421
|
${renderArguments2(args)}
|
@@ -455,7 +459,7 @@ function renderRootCallWrapperFunction(contractFunction, namespace) {
|
|
455
459
|
if (namespace === "" && stateMutability != "") {
|
456
460
|
return "";
|
457
461
|
}
|
458
|
-
const args = ["RootCallWrapper memory self", ...parameters]
|
462
|
+
const args = ["RootCallWrapper memory self", ...parameters];
|
459
463
|
const functionSignature = `
|
460
464
|
function ${name}(
|
461
465
|
${renderArguments2(args)}
|
@@ -496,7 +500,7 @@ function renderFunctionInterface(contractFunction) {
|
|
496
500
|
}
|
497
501
|
function functionInterfaceName(contractFunction) {
|
498
502
|
const { name, parameters } = contractFunction;
|
499
|
-
const paramTypes = parameters.map((param) => param.split(" ")[0]).map((type5) => type5.replace("[]", "Array")).join("_");
|
503
|
+
const paramTypes = parameters.map((param) => param.split(" ")[0]).map((type5) => type5.replace("[]", "Array")).map((type5) => type5.replace(/\[.+\]/, (match2) => stringToHex(match2))).join("_");
|
500
504
|
return `_${name}${paramTypes.length === 0 ? "" : `_${paramTypes}`}`;
|
501
505
|
}
|
502
506
|
function renderEncodeSystemCall(contractFunction) {
|
@@ -516,6 +520,14 @@ function renderReturnParameters2(returnParameters) {
|
|
516
520
|
if (returnParameters.length == 0) return "";
|
517
521
|
return `returns (${renderArguments2(returnParameters)})`;
|
518
522
|
}
|
523
|
+
function formatParams(params) {
|
524
|
+
let auxCount = 0;
|
525
|
+
return params.map((arg) => arg.replace(/ calldata /, " memory ")).map((arg) => {
|
526
|
+
const items = arg.split(" ");
|
527
|
+
const needsAux = items.length === 1 || items.length === 2 && items[1] === "memory";
|
528
|
+
return needsAux ? `${arg} __aux${auxCount++}` : arg;
|
529
|
+
});
|
530
|
+
}
|
519
531
|
|
520
532
|
// ts/node/render-solidity/renderWorldInterface.ts
|
521
533
|
import { renderArguments as renderArguments3, renderedSolidityHeader as renderedSolidityHeader3, renderImports as renderImports3 } from "@latticexyz/common/codegen";
|
@@ -557,7 +569,7 @@ function renderWorldInterface({
|
|
557
569
|
}
|
558
570
|
|
559
571
|
// ts/node/render-solidity/worldgen.ts
|
560
|
-
import
|
572
|
+
import fs2 from "node:fs/promises";
|
561
573
|
import path4 from "node:path";
|
562
574
|
import { formatAndWriteSolidity, contractToInterface } from "@latticexyz/common/codegen";
|
563
575
|
|
@@ -566,6 +578,7 @@ import { isHex } from "viem";
|
|
566
578
|
|
567
579
|
// ts/node/getSystemContracts.ts
|
568
580
|
import path3 from "node:path";
|
581
|
+
import fs from "node:fs/promises";
|
569
582
|
|
570
583
|
// ts/node/findSolidityFiles.ts
|
571
584
|
import path2 from "node:path";
|
@@ -5274,8 +5287,8 @@ var PathScurryBase = class {
|
|
5274
5287
|
*
|
5275
5288
|
* @internal
|
5276
5289
|
*/
|
5277
|
-
constructor(cwd = process.cwd(), pathImpl, sep2, { nocase, childrenCacheSize = 16 * 1024, fs:
|
5278
|
-
this.#fs = fsFromOption(
|
5290
|
+
constructor(cwd = process.cwd(), pathImpl, sep2, { nocase, childrenCacheSize = 16 * 1024, fs: fs4 = defaultFS } = {}) {
|
5291
|
+
this.#fs = fsFromOption(fs4);
|
5279
5292
|
if (cwd instanceof URL || cwd.startsWith("file://")) {
|
5280
5293
|
cwd = fileURLToPath(cwd);
|
5281
5294
|
}
|
@@ -5833,8 +5846,8 @@ var PathScurryWin32 = class extends PathScurryBase {
|
|
5833
5846
|
/**
|
5834
5847
|
* @internal
|
5835
5848
|
*/
|
5836
|
-
newRoot(
|
5837
|
-
return new PathWin32(this.rootPath, IFDIR, void 0, this.roots, this.nocase, this.childrenCache(), { fs:
|
5849
|
+
newRoot(fs4) {
|
5850
|
+
return new PathWin32(this.rootPath, IFDIR, void 0, this.roots, this.nocase, this.childrenCache(), { fs: fs4 });
|
5838
5851
|
}
|
5839
5852
|
/**
|
5840
5853
|
* Return true if the provided path string is an absolute path
|
@@ -5862,8 +5875,8 @@ var PathScurryPosix = class extends PathScurryBase {
|
|
5862
5875
|
/**
|
5863
5876
|
* @internal
|
5864
5877
|
*/
|
5865
|
-
newRoot(
|
5866
|
-
return new PathPosix(this.rootPath, IFDIR, void 0, this.roots, this.nocase, this.childrenCache(), { fs:
|
5878
|
+
newRoot(fs4) {
|
5879
|
+
return new PathPosix(this.rootPath, IFDIR, void 0, this.roots, this.nocase, this.childrenCache(), { fs: fs4 });
|
5867
5880
|
}
|
5868
5881
|
/**
|
5869
5882
|
* Return true if the provided path string is an absolute path
|
@@ -6951,19 +6964,25 @@ async function findSolidityFiles({ cwd, pattern = "**" }) {
|
|
6951
6964
|
}
|
6952
6965
|
|
6953
6966
|
// ts/node/getSystemContracts.ts
|
6967
|
+
import { parseSystem } from "@latticexyz/common/codegen";
|
6968
|
+
import { isDefined } from "@latticexyz/common/utils";
|
6954
6969
|
async function getSystemContracts({
|
6955
6970
|
rootDir,
|
6956
6971
|
config
|
6957
6972
|
}) {
|
6958
|
-
const
|
6973
|
+
const filePaths = await findSolidityFiles({
|
6959
6974
|
cwd: rootDir,
|
6960
6975
|
pattern: path3.join(config.sourceDirectory, "**")
|
6961
6976
|
});
|
6962
|
-
|
6963
|
-
(file) =>
|
6964
|
-
|
6965
|
-
|
6966
|
-
|
6977
|
+
const files = await Promise.all(
|
6978
|
+
filePaths.map(async (file) => {
|
6979
|
+
const source = await fs.readFile(path3.join(rootDir, file.filename), "utf-8");
|
6980
|
+
return { ...file, source };
|
6981
|
+
})
|
6982
|
+
);
|
6983
|
+
return files.map((file) => {
|
6984
|
+
const parsedSystem = parseSystem(file.source, file.basename);
|
6985
|
+
if (!parsedSystem) return;
|
6967
6986
|
const namespaceLabel = (() => {
|
6968
6987
|
if (!config.multipleNamespaces && config.namespace != null) return config.namespace;
|
6969
6988
|
const relativePath = path3.relative(path3.join(rootDir, config.sourceDirectory), file.filename);
|
@@ -6980,7 +6999,7 @@ async function getSystemContracts({
|
|
6980
6999
|
namespaceLabel,
|
6981
7000
|
systemLabel: file.basename
|
6982
7001
|
};
|
6983
|
-
});
|
7002
|
+
}).filter(isDefined);
|
6984
7003
|
}
|
6985
7004
|
|
6986
7005
|
// ts/node/resolveSystems.ts
|
@@ -7038,7 +7057,7 @@ async function worldgen({
|
|
7038
7057
|
config.codegen.outputDirectory,
|
7039
7058
|
config.codegen.worldgenDirectory
|
7040
7059
|
);
|
7041
|
-
const systems = (await resolveSystems({ rootDir, config })).filter((system) => system.deploy.registerWorldFunctions).map((system) => {
|
7060
|
+
const systems = (await resolveSystems({ rootDir, config })).filter((system) => system.deploy.registerWorldFunctions || config.codegen.generateSystemLibraries).map((system) => {
|
7042
7061
|
const interfaceName = `I${system.label}`;
|
7043
7062
|
const libraryName = `${system.label}Lib`;
|
7044
7063
|
const sourceDir = config.multipleNamespaces ? path4.join(config.sourceDirectory, "namespaces", system.namespaceLabel) : config.sourceDirectory;
|
@@ -7058,12 +7077,12 @@ async function worldgen({
|
|
7058
7077
|
if (clean) {
|
7059
7078
|
const libraryDirs = [...new Set(systems.map(({ libraryPath }) => path4.dirname(libraryPath)))];
|
7060
7079
|
await Promise.all([
|
7061
|
-
|
7062
|
-
...libraryDirs.map((dir) =>
|
7080
|
+
fs2.rm(worldgenOutDir, { recursive: true, force: true }),
|
7081
|
+
...libraryDirs.map((dir) => fs2.rm(dir, { recursive: true, force: true }))
|
7063
7082
|
]);
|
7064
7083
|
}
|
7065
7084
|
const outputPath = path4.join(worldgenOutDir, config.codegen.worldInterfaceName + ".sol");
|
7066
|
-
const worldImports = systems.map(
|
7085
|
+
const worldImports = systems.filter((system) => system.deploy.registerWorldFunctions).map(
|
7067
7086
|
(system) => ({
|
7068
7087
|
symbol: system.interfaceName,
|
7069
7088
|
path: "./" + path4.relative(path4.dirname(outputPath), system.interfacePath)
|
@@ -7073,22 +7092,24 @@ async function worldgen({
|
|
7073
7092
|
const worldImportPath = config.codegen.worldImportPath.startsWith(".") ? "./" + path4.relative(path4.dirname(outputPath), path4.join(rootDir, config.codegen.worldImportPath)) : config.codegen.worldImportPath;
|
7074
7093
|
await Promise.all(
|
7075
7094
|
systems.map(async (system) => {
|
7076
|
-
const source = await
|
7095
|
+
const source = await fs2.readFile(path4.join(rootDir, system.sourcePath), "utf8");
|
7077
7096
|
const { functions, errors, symbolImports } = contractToInterface(source, system.label);
|
7078
|
-
|
7079
|
-
|
7080
|
-
symbol,
|
7081
|
-
|
7082
|
-
|
7083
|
-
|
7084
|
-
|
7085
|
-
|
7086
|
-
|
7087
|
-
|
7088
|
-
|
7089
|
-
|
7090
|
-
|
7091
|
-
|
7097
|
+
if (system.deploy.registerWorldFunctions) {
|
7098
|
+
const interfaceImports = symbolImports.map(
|
7099
|
+
({ symbol, path: importPath }) => ({
|
7100
|
+
symbol,
|
7101
|
+
path: importPath.startsWith(".") ? "./" + path4.relative(worldgenOutDir, path4.join(rootDir, path4.dirname(system.sourcePath), importPath)) : importPath
|
7102
|
+
})
|
7103
|
+
);
|
7104
|
+
const systemInterface = renderSystemInterface({
|
7105
|
+
name: system.interfaceName,
|
7106
|
+
functionPrefix: system.namespace === "" ? "" : `${system.namespace}__`,
|
7107
|
+
functions,
|
7108
|
+
errors,
|
7109
|
+
imports: interfaceImports
|
7110
|
+
});
|
7111
|
+
await formatAndWriteSolidity(systemInterface, system.interfacePath, "Generated system interface");
|
7112
|
+
}
|
7092
7113
|
if (config.codegen.generateSystemLibraries) {
|
7093
7114
|
const systemImport = {
|
7094
7115
|
symbol: system.label,
|
@@ -7133,7 +7154,7 @@ async function worldgen({
|
|
7133
7154
|
import path5 from "node:path";
|
7134
7155
|
import { readFile } from "node:fs/promises";
|
7135
7156
|
import { type as type2 } from "arktype";
|
7136
|
-
import { indent, isDefined } from "@latticexyz/common/utils";
|
7157
|
+
import { indent, isDefined as isDefined2 } from "@latticexyz/common/utils";
|
7137
7158
|
import { size, sliceHex } from "viem";
|
7138
7159
|
|
7139
7160
|
// ts/node/common.ts
|
@@ -7211,7 +7232,7 @@ ${indent(artifact.message)}`);
|
|
7211
7232
|
return;
|
7212
7233
|
}
|
7213
7234
|
return artifact;
|
7214
|
-
}).filter(
|
7235
|
+
}).filter(isDefined2).filter(hasMetadata).map((artifact) => {
|
7215
7236
|
artifact;
|
7216
7237
|
const sourcePath = Object.keys(artifact.metadata.settings.compilationTarget)[0];
|
7217
7238
|
const name = artifact.metadata.settings.compilationTarget[sourcePath];
|
@@ -7320,7 +7341,7 @@ async function buildSystemsManifest(opts) {
|
|
7320
7341
|
}
|
7321
7342
|
|
7322
7343
|
// ts/node/loadSystemsManifest.ts
|
7323
|
-
import
|
7344
|
+
import fs3 from "node:fs/promises";
|
7324
7345
|
import path7 from "node:path";
|
7325
7346
|
import { type as type4 } from "arktype";
|
7326
7347
|
import { indent as indent2 } from "@latticexyz/common/utils";
|
@@ -7328,13 +7349,13 @@ var parseManifest = type4("string").pipe.try((s) => JSON.parse(s), SystemsManife
|
|
7328
7349
|
async function loadSystemsManifest(opts) {
|
7329
7350
|
const outFile = path7.join(opts.rootDir, systemsManifestFilename);
|
7330
7351
|
try {
|
7331
|
-
await
|
7352
|
+
await fs3.access(outFile, fs3.constants.F_OK | fs3.constants.R_OK);
|
7332
7353
|
} catch (error2) {
|
7333
7354
|
throw new Error(
|
7334
7355
|
`Systems manifest at "${systemsManifestFilename}" not found or not readable. Run \`mud build\` before trying again.`
|
7335
7356
|
);
|
7336
7357
|
}
|
7337
|
-
const json = await
|
7358
|
+
const json = await fs3.readFile(outFile, "utf8");
|
7338
7359
|
const manifest = parseManifest(json);
|
7339
7360
|
if (manifest instanceof type4.errors) {
|
7340
7361
|
throw new Error(
|