Skip to content

Commit 7c3df69

Browse files
authored
feat(world): strip world prefix from function names when encoding system calls (#3527)
1 parent dfc58be commit 7c3df69

File tree

6 files changed

+49
-9
lines changed

6 files changed

+49
-9
lines changed

.changeset/large-days-confess.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
"@latticexyz/world": patch
3+
---
4+
5+
Using `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.
6+
7+
It's recommended to use a system ABI with these functions rather than a world ABI.
8+
9+
```ts
10+
import systemAbi from "contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json";
11+
encodeSystemCall({ abi: systemAbi, ... });
12+
```

packages/world/ts/encodeSystemCall.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import { Abi, EncodeFunctionDataParameters, Hex, encodeFunctionData, type ContractFunctionName } from "viem";
22
import type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from "abitype";
33
import { worldCallAbi } from "./worldCallAbi";
4+
import { internal_normalizeSystemFunctionName } from "./normalizeSystemFunctionName";
45

5-
export type SystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>> = EncodeFunctionDataParameters<
6-
abi,
7-
functionName
8-
> & {
6+
export type SystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>> = {
7+
/**
8+
* System ABI
9+
*/
10+
readonly abi: abi;
11+
/**
12+
* System's resource ID
13+
*/
914
readonly systemId: Hex;
10-
};
15+
/**
16+
* System function name to call
17+
*/
18+
readonly functionName: functionName;
19+
} & Pick<EncodeFunctionDataParameters<abi, functionName>, "args">;
1120

1221
/** Encode a system call to be passed as arguments into `World.call` */
1322
export function encodeSystemCall<abi extends Abi, functionName extends ContractFunctionName<abi>>({
@@ -20,7 +29,7 @@ export function encodeSystemCall<abi extends Abi, functionName extends ContractF
2029
systemId,
2130
encodeFunctionData<abi, functionName>({
2231
abi,
23-
functionName,
32+
functionName: internal_normalizeSystemFunctionName(systemId, functionName),
2433
args,
2534
} as EncodeFunctionDataParameters<abi, functionName>),
2635
];

packages/world/ts/encodeSystemCallFrom.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Abi, EncodeFunctionDataParameters, encodeFunctionData, Address, type Co
22
import type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from "abitype";
33
import { SystemCall } from "./encodeSystemCall";
44
import { worldCallAbi } from "./worldCallAbi";
5+
import { internal_normalizeSystemFunctionName } from "./normalizeSystemFunctionName";
56

67
export type SystemCallFrom<abi extends Abi, functionName extends ContractFunctionName<abi>> = SystemCall<
78
abi,
@@ -25,7 +26,7 @@ export function encodeSystemCallFrom<abi extends Abi, functionName extends Contr
2526
systemId,
2627
encodeFunctionData<abi, functionName>({
2728
abi,
28-
functionName,
29+
functionName: internal_normalizeSystemFunctionName(systemId, functionName),
2930
args,
3031
} as EncodeFunctionDataParameters<abi, functionName>),
3132
];

packages/world/ts/encodeSystemCalls.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Abi, EncodeFunctionDataParameters, encodeFunctionData, type ContractFun
22
import { SystemCall } from "./encodeSystemCall";
33
import type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from "abitype";
44
import { worldCallAbi } from "./worldCallAbi";
5+
import { internal_normalizeSystemFunctionName } from "./normalizeSystemFunctionName";
56

67
/** Encode system calls to be passed as arguments into `World.batchCall` */
78
export function encodeSystemCalls<abi extends Abi, functionName extends ContractFunctionName<abi>>(
@@ -13,7 +14,7 @@ export function encodeSystemCalls<abi extends Abi, functionName extends Contract
1314
systemId,
1415
callData: encodeFunctionData<abi, functionName>({
1516
abi,
16-
functionName,
17+
functionName: internal_normalizeSystemFunctionName(systemId, functionName),
1718
args,
1819
} as EncodeFunctionDataParameters<abi, functionName>),
1920
})),

packages/world/ts/encodeSystemCallsFrom.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Abi, Address, EncodeFunctionDataParameters, encodeFunctionData, type Co
22
import { SystemCallFrom } from "./encodeSystemCallFrom";
33
import type { AbiParametersToPrimitiveTypes, ExtractAbiFunction } from "abitype";
44
import { worldCallAbi } from "./worldCallAbi";
5+
import { internal_normalizeSystemFunctionName } from "./normalizeSystemFunctionName";
56

67
/** Encode system calls to be passed as arguments into `World.batchCallFrom` */
78
export function encodeSystemCallsFrom<abi extends Abi, functionName extends ContractFunctionName<abi>>(
@@ -15,7 +16,7 @@ export function encodeSystemCallsFrom<abi extends Abi, functionName extends Cont
1516
systemId,
1617
callData: encodeFunctionData<abi, functionName>({
1718
abi,
18-
functionName,
19+
functionName: internal_normalizeSystemFunctionName(systemId, functionName),
1920
args,
2021
} as EncodeFunctionDataParameters<abi, functionName>),
2122
})),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { hexToResource, resourceToLabel } from "@latticexyz/common";
2+
import { Hex } from "viem";
3+
4+
/** @internal */
5+
export function internal_normalizeSystemFunctionName(systemId: Hex, functionName: string) {
6+
const resource = hexToResource(systemId);
7+
const worldFunctionPrefix = resource.namespace !== "" ? `${resource.namespace}__` : null;
8+
if (worldFunctionPrefix != null && functionName.startsWith(worldFunctionPrefix)) {
9+
console.warn(
10+
// eslint-disable-next-line max-len
11+
`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.`,
12+
);
13+
return functionName.slice(worldFunctionPrefix.length);
14+
}
15+
return functionName;
16+
}

0 commit comments

Comments
 (0)