@bananapus/suckers-v6 0.0.9 → 0.0.10

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/STYLE_GUIDE.md CHANGED
@@ -253,9 +253,12 @@ uint256 public constant MAX_RESERVED_PERCENT = 10_000;
253
253
 
254
254
  ## Function Calls
255
255
 
256
- Use named parameters for readability when calling functions with 3+ arguments:
256
+ Use named arguments for all function calls with 2 or more arguments — in both `src/` and `script/`:
257
257
 
258
258
  ```solidity
259
+ // Good — named arguments
260
+ token.mint({account: beneficiary, amount: count});
261
+ _transferOwnership({newOwner: address(0), projectId: 0});
259
262
  PERMISSIONS.hasPermission({
260
263
  operator: sender,
261
264
  account: account,
@@ -264,8 +267,20 @@ PERMISSIONS.hasPermission({
264
267
  includeRoot: true,
265
268
  includeWildcardProjectId: true
266
269
  });
270
+
271
+ // Bad — positional arguments with 2+ args
272
+ token.mint(beneficiary, count);
273
+ _transferOwnership(address(0), 0);
267
274
  ```
268
275
 
276
+ Single-argument calls use positional style: `_burn(amount)`.
277
+
278
+ This also applies to `new` constructor calls, struct literals, and inherited/library calls (e.g., OZ `_mint`, `_safeMint`, `safeTransfer`, `allowance`, `Clones.cloneDeterministic`).
279
+
280
+ **Exception:** Inherited constructor calls in the modifier position (`constructor(...) Parent(a, b)`) do not support named arguments in Solidity — positional style is required there.
281
+
282
+ Named argument keys must use **camelCase** — never underscores. If a function's parameter names use underscores, rename them to camelCase first.
283
+
269
284
  ## Multiline Signatures
270
285
 
271
286
  ```solidity
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bananapus/suckers-v6",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,8 +19,8 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@arbitrum/nitro-contracts": "github:OffchainLabs/nitro-contracts",
22
- "@bananapus/core-v6": "^0.0.15",
23
- "@bananapus/permission-ids-v6": "^0.0.7",
22
+ "@bananapus/core-v6": "^0.0.16",
23
+ "@bananapus/permission-ids-v6": "^0.0.9",
24
24
  "@chainlink/contracts-ccip": "^1.5.0",
25
25
  "@chainlink/local": "github:smartcontractkit/chainlink-local",
26
26
  "@openzeppelin/contracts": "^5.6.1",
@@ -77,11 +77,11 @@ contract DeployScript is Script, Sphinx {
77
77
 
78
78
  // If the registry is already deployed we don't have to deploy it
79
79
  // (and we can't add more pre_approved deployers etc.)
80
- if (!_isDeployed(
81
- REGISTRY_SALT,
82
- type(JBSuckerRegistry).creationCode,
83
- abi.encode(core.directory, core.permissions, safeAddress(), TRUSTED_FORWARDER)
84
- )) {
80
+ if (!_isDeployed({
81
+ salt: REGISTRY_SALT,
82
+ creationCode: type(JBSuckerRegistry).creationCode,
83
+ arguments: abi.encode(core.directory, core.permissions, safeAddress(), TRUSTED_FORWARDER)
84
+ })) {
85
85
  // Deploy the registry and pre-aprove the deployers we just deployed.
86
86
  JBSuckerRegistry _registry = new JBSuckerRegistry{salt: REGISTRY_SALT}({
87
87
  directory: core.directory,
@@ -113,11 +113,11 @@ contract DeployScript is Script, Sphinx {
113
113
  function _optimismSucker() internal {
114
114
  // Check if this sucker is already deployed on this chain,
115
115
  // if that is the case we don't need to do anything else for this chain.
116
- if (_isDeployed(
117
- OP_SALT,
118
- type(JBOptimismSuckerDeployer).creationCode,
119
- abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
120
- )) return;
116
+ if (_isDeployed({
117
+ salt: OP_SALT,
118
+ creationCode: type(JBOptimismSuckerDeployer).creationCode,
119
+ arguments: abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
120
+ })) return;
121
121
 
122
122
  // Check if we should do the L1 portion.
123
123
  // ETH Mainnet and ETH Sepolia.
@@ -130,18 +130,18 @@ contract DeployScript is Script, Sphinx {
130
130
  trustedForwarder: TRUSTED_FORWARDER
131
131
  });
132
132
 
133
- _opDeployer.setChainSpecificConstants(
134
- IOPMessenger(
133
+ _opDeployer.setChainSpecificConstants({
134
+ messenger: IOPMessenger(
135
135
  block.chainid == 1
136
136
  ? address(0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1)
137
137
  : address(0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef)
138
138
  ),
139
- IOPStandardBridge(
139
+ bridge: IOPStandardBridge(
140
140
  block.chainid == 1
141
141
  ? address(0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1)
142
142
  : address(0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1)
143
143
  )
144
- );
144
+ });
145
145
 
146
146
  // Deploy the singleton instance.
147
147
  JBOptimismSucker _singleton = new JBOptimismSucker{salt: OP_SALT}({
@@ -170,10 +170,10 @@ contract DeployScript is Script, Sphinx {
170
170
  trustedForwarder: TRUSTED_FORWARDER
171
171
  });
172
172
 
173
- _opDeployer.setChainSpecificConstants(
174
- IOPMessenger(0x4200000000000000000000000000000000000007),
175
- IOPStandardBridge(0x4200000000000000000000000000000000000010)
176
- );
173
+ _opDeployer.setChainSpecificConstants({
174
+ messenger: IOPMessenger(0x4200000000000000000000000000000000000007),
175
+ bridge: IOPStandardBridge(0x4200000000000000000000000000000000000010)
176
+ });
177
177
 
178
178
  // Deploy the singleton instance.
179
179
  JBOptimismSucker _singleton = new JBOptimismSucker{salt: OP_SALT}({
@@ -196,11 +196,11 @@ contract DeployScript is Script, Sphinx {
196
196
  function _baseSucker() internal {
197
197
  // Check if this sucker is already deployed on this chain,
198
198
  // if that is the case we don't need to do anything else for this chain.
199
- if (_isDeployed(
200
- BASE_SALT,
201
- type(JBBaseSuckerDeployer).creationCode,
202
- abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
203
- )) return;
199
+ if (_isDeployed({
200
+ salt: BASE_SALT,
201
+ creationCode: type(JBBaseSuckerDeployer).creationCode,
202
+ arguments: abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
203
+ })) return;
204
204
 
205
205
  // Check if we should do the L1 portion.
206
206
  // ETH Mainnet and ETH Sepolia.
@@ -213,18 +213,18 @@ contract DeployScript is Script, Sphinx {
213
213
  trustedForwarder: TRUSTED_FORWARDER
214
214
  });
215
215
 
216
- _baseDeployer.setChainSpecificConstants(
217
- IOPMessenger(
216
+ _baseDeployer.setChainSpecificConstants({
217
+ messenger: IOPMessenger(
218
218
  block.chainid == 1
219
219
  ? address(0x866E82a600A1414e583f7F13623F1aC5d58b0Afa)
220
220
  : address(0xC34855F4De64F1840e5686e64278da901e261f20)
221
221
  ),
222
- IOPStandardBridge(
222
+ bridge: IOPStandardBridge(
223
223
  block.chainid == 1
224
224
  ? address(0x3154Cf16ccdb4C6d922629664174b904d80F2C35)
225
225
  : address(0xfd0Bf71F60660E2f608ed56e1659C450eB113120)
226
226
  )
227
- );
227
+ });
228
228
 
229
229
  // Deploy the singleton instance.
230
230
  JBBaseSucker _singleton = new JBBaseSucker{salt: BASE_SALT}({
@@ -253,10 +253,10 @@ contract DeployScript is Script, Sphinx {
253
253
  trustedForwarder: TRUSTED_FORWARDER
254
254
  });
255
255
 
256
- _baseDeployer.setChainSpecificConstants(
257
- IOPMessenger(0x4200000000000000000000000000000000000007),
258
- IOPStandardBridge(0x4200000000000000000000000000000000000010)
259
- );
256
+ _baseDeployer.setChainSpecificConstants({
257
+ messenger: IOPMessenger(0x4200000000000000000000000000000000000007),
258
+ bridge: IOPStandardBridge(0x4200000000000000000000000000000000000010)
259
+ });
260
260
 
261
261
  // Deploy the singleton instance.
262
262
  JBBaseSucker _singleton = new JBBaseSucker{salt: BASE_SALT}({
@@ -280,11 +280,11 @@ contract DeployScript is Script, Sphinx {
280
280
  function _arbitrumSucker() internal {
281
281
  // Check if this sucker is already deployed on this chain,
282
282
  // if that is the case we don't need to do anything else for this chain.
283
- if (_isDeployed(
284
- ARB_SALT,
285
- type(JBArbitrumSuckerDeployer).creationCode,
286
- abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
287
- )) return;
283
+ if (_isDeployed({
284
+ salt: ARB_SALT,
285
+ creationCode: type(JBArbitrumSuckerDeployer).creationCode,
286
+ arguments: abi.encode(core.directory, core.permissions, core.tokens, safeAddress(), TRUSTED_FORWARDER)
287
+ })) return;
288
288
 
289
289
  // Check if we should do the L1 portion.
290
290
  // ETH Mainnet and ETH Sepolia.
@@ -362,19 +362,29 @@ contract DeployScript is Script, Sphinx {
362
362
  if (block.chainid == 1 || block.chainid == 11_155_111) {
363
363
  // Optimsim
364
364
  PRE_APPROVED_DEPLOYERS.push(
365
- address(_deployCCIPSuckerFor(OP_SALT, block.chainid == 1 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID))
365
+ address(
366
+ _deployCCIPSuckerFor({
367
+ salt: OP_SALT, remoteChainId: block.chainid == 1 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID
368
+ })
369
+ )
366
370
  );
367
371
 
368
372
  // Base
369
373
  PRE_APPROVED_DEPLOYERS.push(
370
374
  address(
371
- _deployCCIPSuckerFor(BASE_SALT, block.chainid == 1 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID)
375
+ _deployCCIPSuckerFor({
376
+ salt: BASE_SALT, remoteChainId: block.chainid == 1 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID
377
+ })
372
378
  )
373
379
  );
374
380
 
375
381
  // Arbitrum
376
382
  PRE_APPROVED_DEPLOYERS.push(
377
- address(_deployCCIPSuckerFor(ARB_SALT, block.chainid == 1 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID))
383
+ address(
384
+ _deployCCIPSuckerFor({
385
+ salt: ARB_SALT, remoteChainId: block.chainid == 1 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID
386
+ })
387
+ )
378
388
  );
379
389
  }
380
390
 
@@ -384,23 +394,30 @@ contract DeployScript is Script, Sphinx {
384
394
  // L1.
385
395
  PRE_APPROVED_DEPLOYERS.push(
386
396
  address(
387
- _deployCCIPSuckerFor(ARB_SALT, block.chainid == 42_161 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID)
397
+ _deployCCIPSuckerFor({
398
+ salt: ARB_SALT,
399
+ remoteChainId: block.chainid == 42_161 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID
400
+ })
388
401
  )
389
402
  );
390
403
 
391
404
  // ARB -> OP.
392
405
  PRE_APPROVED_DEPLOYERS.push(
393
406
  address(
394
- _deployCCIPSuckerFor(ARB_OP_SALT, block.chainid == 42_161 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID)
407
+ _deployCCIPSuckerFor({
408
+ salt: ARB_OP_SALT,
409
+ remoteChainId: block.chainid == 42_161 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID
410
+ })
395
411
  )
396
412
  );
397
413
 
398
414
  // ARB -> BASE.
399
415
  PRE_APPROVED_DEPLOYERS.push(
400
416
  address(
401
- _deployCCIPSuckerFor(
402
- ARB_BASE_SALT, block.chainid == 42_161 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID
403
- )
417
+ _deployCCIPSuckerFor({
418
+ salt: ARB_BASE_SALT,
419
+ remoteChainId: block.chainid == 42_161 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID
420
+ })
404
421
  )
405
422
  );
406
423
 
@@ -408,22 +425,30 @@ contract DeployScript is Script, Sphinx {
408
425
  } else if (block.chainid == 10 || block.chainid == 11_155_420) {
409
426
  // L1.
410
427
  PRE_APPROVED_DEPLOYERS.push(
411
- address(_deployCCIPSuckerFor(OP_SALT, block.chainid == 10 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID))
428
+ address(
429
+ _deployCCIPSuckerFor({
430
+ salt: OP_SALT, remoteChainId: block.chainid == 10 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID
431
+ })
432
+ )
412
433
  );
413
434
 
414
435
  // OP -> ARB.
415
436
  PRE_APPROVED_DEPLOYERS.push(
416
437
  address(
417
- _deployCCIPSuckerFor(ARB_OP_SALT, block.chainid == 10 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID)
438
+ _deployCCIPSuckerFor({
439
+ salt: ARB_OP_SALT,
440
+ remoteChainId: block.chainid == 10 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID
441
+ })
418
442
  )
419
443
  );
420
444
 
421
445
  // OP -> BASE.
422
446
  PRE_APPROVED_DEPLOYERS.push(
423
447
  address(
424
- _deployCCIPSuckerFor(
425
- OP_BASE_SALT, block.chainid == 10 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID
426
- )
448
+ _deployCCIPSuckerFor({
449
+ salt: OP_BASE_SALT,
450
+ remoteChainId: block.chainid == 10 ? CCIPHelper.BASE_ID : CCIPHelper.BASE_SEP_ID
451
+ })
427
452
  )
428
453
  );
429
454
 
@@ -432,23 +457,30 @@ contract DeployScript is Script, Sphinx {
432
457
  // L1.
433
458
  PRE_APPROVED_DEPLOYERS.push(
434
459
  address(
435
- _deployCCIPSuckerFor(BASE_SALT, block.chainid == 8453 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID)
460
+ _deployCCIPSuckerFor({
461
+ salt: BASE_SALT,
462
+ remoteChainId: block.chainid == 8453 ? CCIPHelper.ETH_ID : CCIPHelper.ETH_SEP_ID
463
+ })
436
464
  )
437
465
  );
438
466
 
439
467
  // BASE -> OP.
440
468
  PRE_APPROVED_DEPLOYERS.push(
441
469
  address(
442
- _deployCCIPSuckerFor(OP_BASE_SALT, block.chainid == 8453 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID)
470
+ _deployCCIPSuckerFor({
471
+ salt: OP_BASE_SALT,
472
+ remoteChainId: block.chainid == 8453 ? CCIPHelper.OP_ID : CCIPHelper.OP_SEP_ID
473
+ })
443
474
  )
444
475
  );
445
476
 
446
477
  // BASE -> ARB.
447
478
  PRE_APPROVED_DEPLOYERS.push(
448
479
  address(
449
- _deployCCIPSuckerFor(
450
- ARB_BASE_SALT, block.chainid == 8453 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID
451
- )
480
+ _deployCCIPSuckerFor({
481
+ salt: ARB_BASE_SALT,
482
+ remoteChainId: block.chainid == 8453 ? CCIPHelper.ARB_ID : CCIPHelper.ARB_SEP_ID
483
+ })
452
484
  )
453
485
  );
454
486
  }
@@ -458,19 +490,19 @@ contract DeployScript is Script, Sphinx {
458
490
  internal
459
491
  returns (JBCCIPSuckerDeployer deployer)
460
492
  {
461
- return _deployCCIPSuckerWith(
462
- salt,
463
- core.directory,
464
- core.permissions,
465
- core.tokens,
466
- safeAddress(),
467
- TRUSTED_FORWARDER,
468
- remoteChainId,
493
+ return _deployCCIPSuckerWith({
494
+ salt: salt,
495
+ directory: core.directory,
496
+ permissions: core.permissions,
497
+ tokens: core.tokens,
498
+ configurator: safeAddress(),
499
+ trustedForwarder: TRUSTED_FORWARDER,
500
+ remoteChainId: remoteChainId,
469
501
  // Get the selector of the other side.
470
- CCIPHelper.selectorOfChain(remoteChainId),
502
+ remoteChainSelector: CCIPHelper.selectorOfChain(remoteChainId),
471
503
  // Get the router for this side.
472
- ICCIPRouter(CCIPHelper.routerOfChain(block.chainid))
473
- );
504
+ router: ICCIPRouter(CCIPHelper.routerOfChain(block.chainid))
505
+ });
474
506
  }
475
507
 
476
508
  function _deployCCIPSuckerWith(
@@ -487,9 +519,17 @@ contract DeployScript is Script, Sphinx {
487
519
  internal
488
520
  returns (JBCCIPSuckerDeployer deployer)
489
521
  {
490
- deployer = new JBCCIPSuckerDeployer{salt: salt}(directory, permissions, tokens, configurator, trustedForwarder);
522
+ deployer = new JBCCIPSuckerDeployer{salt: salt}({
523
+ directory: directory,
524
+ permissions: permissions,
525
+ tokens: tokens,
526
+ configurator: configurator,
527
+ trustedForwarder: trustedForwarder
528
+ });
491
529
 
492
- deployer.setChainSpecificConstants(remoteChainId, remoteChainSelector, router);
530
+ deployer.setChainSpecificConstants({
531
+ remoteChainId: remoteChainId, remoteChainSelector: remoteChainSelector, router: router
532
+ });
493
533
 
494
534
  // Deploy the singleton instance.
495
535
  JBCCIPSucker singleton = new JBCCIPSucker{salt: salt}({
@@ -32,7 +32,7 @@ library SuckerDeploymentLib {
32
32
 
33
33
  for (uint256 _i; _i < networks.length; _i++) {
34
34
  if (networks[_i].chainId == chainId) {
35
- return getDeployment(path, networks[_i].name);
35
+ return getDeployment({path: path, networkName: networks[_i].name});
36
36
  }
37
37
  }
38
38
 
@@ -41,17 +41,20 @@ library SuckerDeploymentLib {
41
41
 
42
42
  function getDeployment(
43
43
  string memory path,
44
- string memory network_name
44
+ string memory networkName
45
45
  )
46
46
  internal
47
47
  view
48
48
  returns (SuckerDeployment memory deployment)
49
49
  {
50
50
  // Is deployed on all (supported) chains.
51
- deployment.registry =
52
- IJBSuckerRegistry(_getDeploymentAddress(path, "nana-suckers-v5", network_name, "JBSuckerRegistry"));
51
+ deployment.registry = IJBSuckerRegistry(
52
+ _getDeploymentAddress({
53
+ path: path, projectName: "nana-suckers-v5", networkName: networkName, contractName: "JBSuckerRegistry"
54
+ })
55
+ );
53
56
 
54
- bytes32 _network = keccak256(abi.encodePacked(network_name));
57
+ bytes32 _network = keccak256(abi.encodePacked(networkName));
55
58
  bool _isMainnet = _network == keccak256("ethereum") || _network == keccak256("sepolia");
56
59
  bool _isOP = _network == keccak256("optimism") || _network == keccak256("optimism_sepolia");
57
60
  bool _isBase = _network == keccak256("base") || _network == keccak256("base_sepolia");
@@ -59,18 +62,34 @@ library SuckerDeploymentLib {
59
62
 
60
63
  if (_isMainnet || _isOP) {
61
64
  deployment.optimismDeployer = IJBSuckerDeployer(
62
- _getDeploymentAddress(path, "nana-suckers-v5", network_name, "JBOptimismSuckerDeployer")
65
+ _getDeploymentAddress({
66
+ path: path,
67
+ projectName: "nana-suckers-v5",
68
+ networkName: networkName,
69
+ contractName: "JBOptimismSuckerDeployer"
70
+ })
63
71
  );
64
72
  }
65
73
 
66
74
  if (_isMainnet || _isBase) {
67
- deployment.baseDeployer =
68
- IJBSuckerDeployer(_getDeploymentAddress(path, "nana-suckers-v5", network_name, "JBBaseSuckerDeployer"));
75
+ deployment.baseDeployer = IJBSuckerDeployer(
76
+ _getDeploymentAddress({
77
+ path: path,
78
+ projectName: "nana-suckers-v5",
79
+ networkName: networkName,
80
+ contractName: "JBBaseSuckerDeployer"
81
+ })
82
+ );
69
83
  }
70
84
 
71
85
  if (_isMainnet || _isArb) {
72
86
  deployment.arbitrumDeployer = IJBSuckerDeployer(
73
- _getDeploymentAddress(path, "nana-suckers-v5", network_name, "JBArbitrumSuckerDeployer")
87
+ _getDeploymentAddress({
88
+ path: path,
89
+ projectName: "nana-suckers-v5",
90
+ networkName: networkName,
91
+ contractName: "JBArbitrumSuckerDeployer"
92
+ })
74
93
  );
75
94
  }
76
95
  }
@@ -82,8 +101,8 @@ library SuckerDeploymentLib {
82
101
  /// @return The address of the contract.
83
102
  function _getDeploymentAddress(
84
103
  string memory path,
85
- string memory project_name,
86
- string memory network_name,
104
+ string memory projectName,
105
+ string memory networkName,
87
106
  string memory contractName
88
107
  )
89
108
  internal
@@ -91,7 +110,7 @@ library SuckerDeploymentLib {
91
110
  returns (address)
92
111
  {
93
112
  string memory deploymentJson =
94
- vm.readFile(string.concat(path, project_name, "/", network_name, "/", contractName, ".json"));
95
- return stdJson.readAddress(deploymentJson, ".address");
113
+ vm.readFile(string.concat(path, projectName, "/", networkName, "/", contractName, ".json"));
114
+ return stdJson.readAddress({json: deploymentJson, key: ".address"});
96
115
  }
97
116
  }
@@ -230,7 +230,7 @@ contract JBCCIPSucker is JBSucker, IAny2EVMMessageReceiver {
230
230
  tokenAmounts[0] = Client.EVMTokenAmount({token: token, amount: amount});
231
231
 
232
232
  // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token
233
- SafeERC20.forceApprove(IERC20(token), address(CCIP_ROUTER), amount);
233
+ SafeERC20.forceApprove({token: IERC20(token), spender: address(CCIP_ROUTER), value: amount});
234
234
  }
235
235
 
236
236
  // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message
@@ -190,7 +190,7 @@ contract JBCeloSucker is JBOptimismSucker {
190
190
  metadata: ""
191
191
  });
192
192
  } else {
193
- super._addToBalance(token, amount);
193
+ super._addToBalance({token: token, amount: amount});
194
194
  }
195
195
  }
196
196
  }
@@ -147,7 +147,7 @@ abstract contract JBSuckerDeployer is ERC2771Context, JBPermissioned, IJBSuckerD
147
147
  salt = keccak256(abi.encodePacked(_msgSender(), salt));
148
148
 
149
149
  // Clone the singleton.
150
- sucker = IJBSucker(LibClone.cloneDeterministic(address(singleton), salt));
150
+ sucker = IJBSucker(LibClone.cloneDeterministic({implementation: address(singleton), salt: salt}));
151
151
 
152
152
  // Mark it as a sucker that was deployed by this deployer.
153
153
  isSucker[address(sucker)] = true;