@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 +16 -1
- package/package.json +3 -3
- package/script/Deploy.s.sol +107 -67
- package/script/helpers/SuckerDeploymentLib.sol +32 -13
- package/src/JBCCIPSucker.sol +1 -1
- package/src/JBCeloSucker.sol +1 -1
- package/src/deployers/JBSuckerDeployer.sol +1 -1
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
|
|
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.
|
|
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.
|
|
23
|
-
"@bananapus/permission-ids-v6": "^0.0.
|
|
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",
|
package/script/Deploy.s.sol
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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(
|
|
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(
|
|
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,
|
|
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(
|
|
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(
|
|
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,
|
|
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}(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
86
|
-
string memory
|
|
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,
|
|
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
|
}
|
package/src/JBCCIPSucker.sol
CHANGED
|
@@ -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
|
package/src/JBCeloSucker.sol
CHANGED
|
@@ -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;
|