Skip to content

Commit 2257730

Browse files
committed
Fix multisend config review findings
1 parent 1158e8f commit 2257730

3 files changed

Lines changed: 75 additions & 14 deletions

File tree

src/Safe.sol

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ library Safe {
6868
return self.instances[self.instances.length - 1];
6969
}
7070

71+
// Keep the first Client parameter so existing `using Safe for *` call sites remain unchanged.
7172
function getApiKitUrl(Client storage, uint256 chainId) internal pure returns (string memory) {
7273
if (chainId == 98866) {
7374
return PLUME_TRANSACTION_SERVICE_URL;
@@ -123,13 +124,15 @@ library Safe {
123124
return string.concat(SAFE_TRANSACTION_SERVICE_BASE_URL, "/", getNetworkShortName(chainId), "/api");
124125
}
125126

127+
// Keep the first Client parameter so existing `using Safe for *` call sites remain unchanged.
126128
function getMultiSendCallOnly(Client storage, uint256 chainId) internal pure returns (MultiSendCallOnly) {
127129
if (chainId == 98866) {
128-
return MultiSendCallOnly(MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
130+
return MultiSendCallOnly(MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
129131
}
130132
if (chainId == 324) {
131133
return MultiSendCallOnly(MULTI_SEND_CALL_ONLY_ADDRESS_V130_ZKSYNC);
132134
}
135+
// safe-deployments registers Lens against the zkSync deployment in both v1.3.0 and v1.4.1.
133136
if (chainId == 232) {
134137
return MultiSendCallOnly(MULTI_SEND_CALL_ONLY_ADDRESS_V141_ZKSYNC);
135138
}
@@ -145,15 +148,15 @@ library Safe {
145148
function _usesV130CanonicalMultiSend(uint256 chainId) private pure returns (bool) {
146149
return (chainId == 1 || chainId == 10 || chainId == 56 || chainId == 100 || chainId == 130 || chainId == 137
147150
|| chainId == 196 || chainId == 480 || chainId == 999 || chainId == 1101 || chainId == 5000
148-
|| chainId == 8453 || chainId == 42161 || chainId == 42220 || chainId == 43114 || chainId == 59144
149-
|| chainId == 84532 || chainId == 534352 || chainId == 11155111 || chainId == 1313161554);
151+
|| chainId == 8453 || chainId == 10200 || chainId == 42161 || chainId == 42220 || chainId == 43114
152+
|| chainId == 59144 || chainId == 84532 || chainId == 534352 || chainId == 11155111
153+
|| chainId == 1313161554);
150154
}
151155

152156
function _usesV141CanonicalMultiSend(uint256 chainId) private pure returns (bool) {
153157
return (chainId == 50 || chainId == 143 || chainId == 146 || chainId == 204 || chainId == 988 || chainId == 3338
154-
|| chainId == 3637 || chainId == 9745 || chainId == 10143 || chainId == 10200 || chainId == 16661
155-
|| chainId == 43111 || chainId == 57073 || chainId == 80069 || chainId == 80094 || chainId == 81224
156-
|| chainId == 747474);
158+
|| chainId == 3637 || chainId == 9745 || chainId == 10143 || chainId == 16661 || chainId == 43111
159+
|| chainId == 57073 || chainId == 80069 || chainId == 80094 || chainId == 81224 || chainId == 747474);
157160
}
158161

159162
function getNonce(Client storage self) internal view returns (uint256) {

test/ffi/safe-api-kit-config.cjs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const fs = require("fs");
22
const vm = require("vm");
33

4+
const MIN_EXPECTED_NETWORKS = 39;
45
const bundlePath = require.resolve("@safe-global/api-kit");
56
const bundle = fs.readFileSync(bundlePath, "utf8");
67

@@ -15,11 +16,28 @@ if (!networksMatch) {
1516
}
1617

1718
const networks = vm.runInNewContext(networksMatch[1]);
19+
if (!Array.isArray(networks) || networks.length < MIN_EXPECTED_NETWORKS) {
20+
throw new Error(`Unexpected networks config shape in ${bundlePath}`);
21+
}
22+
1823
const chainIds = [];
1924
const urls = [];
25+
const seenChainIds = new Set();
2026

2127
for (const network of networks) {
22-
chainIds.push(Number(network.chainId));
28+
const chainId = Number(network.chainId);
29+
if (!Number.isInteger(chainId)) {
30+
throw new Error(`Invalid chainId in ${bundlePath}: ${network.chainId}`);
31+
}
32+
if (typeof network.shortName !== "string" || network.shortName.length === 0) {
33+
throw new Error(`Invalid shortName in ${bundlePath}: ${String(network.shortName)}`);
34+
}
35+
if (seenChainIds.has(chainId)) {
36+
throw new Error(`Duplicate chainId in ${bundlePath}: ${chainId}`);
37+
}
38+
39+
seenChainIds.add(chainId);
40+
chainIds.push(chainId);
2341
urls.push(`${baseUrlMatch[1]}/${network.shortName}/api`);
2442
}
2543

test/helpers/SafeConfigFixtures.sol

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
pragma solidity ^0.8.13;
33

44
library SafeConfigFixtures {
5+
address constant MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL = 0x40A2aCCbd92BCA938b02010E17A5b8929b49130D;
6+
address constant MULTI_SEND_CALL_ONLY_ADDRESS_V130_ZKSYNC = 0xf220D3b4DFb23C4ade8C88E526C1353AbAcbC38F;
7+
address constant MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL = 0x9641d764fc13c8B624c04430C7356C1C7C8102e2;
8+
address constant MULTI_SEND_CALL_ONLY_ADDRESS_V141_ZKSYNC = 0x0408EF011960d02349d50286D20531229BCef773;
9+
510
function officialChains() internal pure returns (uint256[] memory chainIds, string[] memory shortNames) {
611
chainIds = new uint256[](39);
712
shortNames = new string[](39);
@@ -49,15 +54,50 @@ library SafeConfigFixtures {
4954
}
5055

5156
function multiSendChains() internal pure returns (uint256[] memory chainIds, address[] memory expected) {
52-
chainIds = new uint256[](5);
53-
expected = new address[](5);
57+
chainIds = new uint256[](40);
58+
expected = new address[](40);
5459
uint256 index;
5560

56-
index = _pushMultiSend(chainIds, expected, index, 1, 0x40A2aCCbd92BCA938b02010E17A5b8929b49130D);
57-
index = _pushMultiSend(chainIds, expected, index, 324, 0xf220D3b4DFb23C4ade8C88E526C1353AbAcbC38F);
58-
index = _pushMultiSend(chainIds, expected, index, 232, 0x0408EF011960d02349d50286D20531229BCef773);
59-
index = _pushMultiSend(chainIds, expected, index, 10143, 0x9641d764fc13c8B624c04430C7356C1C7C8102e2);
60-
_pushMultiSend(chainIds, expected, index, 98866, 0x40A2aCCbd92BCA938b02010E17A5b8929b49130D);
61+
index = _pushMultiSend(chainIds, expected, index, 1, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
62+
index = _pushMultiSend(chainIds, expected, index, 10, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
63+
index = _pushMultiSend(chainIds, expected, index, 50, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
64+
index = _pushMultiSend(chainIds, expected, index, 56, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
65+
index = _pushMultiSend(chainIds, expected, index, 100, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
66+
index = _pushMultiSend(chainIds, expected, index, 130, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
67+
index = _pushMultiSend(chainIds, expected, index, 137, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
68+
index = _pushMultiSend(chainIds, expected, index, 143, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
69+
index = _pushMultiSend(chainIds, expected, index, 146, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
70+
index = _pushMultiSend(chainIds, expected, index, 196, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
71+
index = _pushMultiSend(chainIds, expected, index, 204, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
72+
index = _pushMultiSend(chainIds, expected, index, 232, MULTI_SEND_CALL_ONLY_ADDRESS_V141_ZKSYNC);
73+
index = _pushMultiSend(chainIds, expected, index, 324, MULTI_SEND_CALL_ONLY_ADDRESS_V130_ZKSYNC);
74+
index = _pushMultiSend(chainIds, expected, index, 480, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
75+
index = _pushMultiSend(chainIds, expected, index, 988, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
76+
index = _pushMultiSend(chainIds, expected, index, 999, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
77+
index = _pushMultiSend(chainIds, expected, index, 1101, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
78+
index = _pushMultiSend(chainIds, expected, index, 3338, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
79+
index = _pushMultiSend(chainIds, expected, index, 3637, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
80+
index = _pushMultiSend(chainIds, expected, index, 5000, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
81+
index = _pushMultiSend(chainIds, expected, index, 8453, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
82+
index = _pushMultiSend(chainIds, expected, index, 9745, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
83+
index = _pushMultiSend(chainIds, expected, index, 10143, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
84+
index = _pushMultiSend(chainIds, expected, index, 10200, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
85+
index = _pushMultiSend(chainIds, expected, index, 16661, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
86+
index = _pushMultiSend(chainIds, expected, index, 42161, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
87+
index = _pushMultiSend(chainIds, expected, index, 42220, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
88+
index = _pushMultiSend(chainIds, expected, index, 43111, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
89+
index = _pushMultiSend(chainIds, expected, index, 43114, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
90+
index = _pushMultiSend(chainIds, expected, index, 57073, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
91+
index = _pushMultiSend(chainIds, expected, index, 59144, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
92+
index = _pushMultiSend(chainIds, expected, index, 80069, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
93+
index = _pushMultiSend(chainIds, expected, index, 80094, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
94+
index = _pushMultiSend(chainIds, expected, index, 81224, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
95+
index = _pushMultiSend(chainIds, expected, index, 84532, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
96+
index = _pushMultiSend(chainIds, expected, index, 534352, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
97+
index = _pushMultiSend(chainIds, expected, index, 747474, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
98+
index = _pushMultiSend(chainIds, expected, index, 11155111, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
99+
index = _pushMultiSend(chainIds, expected, index, 1313161554, MULTI_SEND_CALL_ONLY_ADDRESS_V130_CANONICAL);
100+
_pushMultiSend(chainIds, expected, index, 98866, MULTI_SEND_CALL_ONLY_ADDRESS_V141_CANONICAL);
61101
}
62102

63103
function _pushOfficial(

0 commit comments

Comments
 (0)