@@ -232,6 +232,7 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
232
232
"PoolAdminNFT" ,
233
233
"PoolMemberNFT" ,
234
234
"IAccessControlEnumerable" ,
235
+ "SimpleForwarder" ,
235
236
"ERC2771Forwarder" ,
236
237
] ;
237
238
const mockContracts = [
@@ -270,6 +271,7 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
270
271
PoolAdminNFT,
271
272
PoolMemberNFT,
272
273
IAccessControlEnumerable,
274
+ SimpleForwarder,
273
275
ERC2771Forwarder,
274
276
} = await SuperfluidSDK . loadContracts ( {
275
277
...extractWeb3Options ( options ) ,
@@ -351,6 +353,10 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
351
353
`Superfluid.${ protocolReleaseVersion } ` ,
352
354
async ( contractAddress ) => ! ( await hasCode ( web3 , contractAddress ) ) ,
353
355
async ( ) => {
356
+ const simpleForwarder = await web3tx ( SimpleForwarder . new , "SimpleForwarder.new" ) ( ) ;
357
+ console . log ( "SimpleForwarder address:" , simpleForwarder . address ) ;
358
+ output += `SIMPLE_FORWARDER=${ simpleForwarder . address } \n` ;
359
+
354
360
const erc2771Forwarder = await web3tx ( ERC2771Forwarder . new , "ERC2771Forwarder.new" ) ( ) ;
355
361
console . log ( "ERC2771Forwarder address:" , erc2771Forwarder . address ) ;
356
362
output += `ERC2771_FORWARDER=${ erc2771Forwarder . address } \n` ;
@@ -359,15 +365,12 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
359
365
const superfluidLogic = await web3tx (
360
366
SuperfluidLogic . new ,
361
367
"SuperfluidLogic.new"
362
- ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , erc2771Forwarder . address ) ;
368
+ ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , simpleForwarder . address , erc2771Forwarder . address ) ;
363
369
console . log (
364
370
`Superfluid new code address ${ superfluidLogic . address } `
365
371
) ;
366
372
output += `SUPERFLUID_HOST_LOGIC=${ superfluidLogic . address } \n` ;
367
- // get the address of SimpleForwarder (deployed in constructor) for verification
368
- const simpleForwarderAddr = await superfluidLogic . SIMPLE_FORWARDER ( ) ;
369
- console . log ( "SimpleForwarder address" , simpleForwarderAddr ) ;
370
- output += `SIMPLE_FORWARDER=${ simpleForwarderAddr } \n` ;
373
+
371
374
if ( ! nonUpgradable ) {
372
375
const proxy = await web3tx (
373
376
UUPSProxy . new ,
@@ -383,10 +386,15 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
383
386
superfluidAddress = superfluidLogic . address ;
384
387
}
385
388
const superfluid = await Superfluid . at ( superfluidAddress ) ;
389
+ await web3tx (
390
+ simpleForwarder . transferOwnership ,
391
+ "simpleForwarder.transferOwnership"
392
+ ) ( superfluid . address ) ;
386
393
await web3tx (
387
394
erc2771Forwarder . transferOwnership ,
388
395
"erc2771Forwarder.transferOwnership"
389
396
) ( superfluid . address ) ;
397
+
390
398
await web3tx (
391
399
superfluid . initialize ,
392
400
"Superfluid.initialize"
@@ -784,33 +792,60 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
784
792
throw new Error ( "Superfluid is not upgradable" ) ;
785
793
}
786
794
787
- async function getPrevERC2771ForwarderAddr ( ) {
788
- try {
789
- return await superfluid . getERC2771Forwarder ( ) ;
790
- } catch ( err ) {
791
- console . error ( "### Error getting ERC2771Forwarder address, likely not yet deployed" ) ;
792
- return ZERO_ADDRESS ; // fallback
795
+ async function getOrDeployForwarder (
796
+ superfluid ,
797
+ ForwarderContract ,
798
+ getPrevAddrFn ,
799
+ outputKey
800
+ ) {
801
+ let prevAddr = await getPrevAddrFn ( ) . catch ( _err => {
802
+ console . error ( `### Error getting ${ ForwarderContract . contractName } address, likely not yet deployed` ) ;
803
+ return ZERO_ADDRESS ;
804
+ } ) ;
805
+
806
+ {
807
+ // TEMPORARY FIX - can be removed after applied
808
+ // we found a previous deployment. Now verify it has the host as owner.
809
+ // the first mainnet deployment didn't have this for SimpleForwarder, thus needs a redeployment.
810
+ const ownerAddr = await ( await Ownable . at ( prevAddr ) ) . owner ( ) ;
811
+ if ( ownerAddr != superfluid . address ) {
812
+ console . log ( ` !!! ${ outputKey } has wrong owner, needs re-deployment` ) ;
813
+ prevAddr = ZERO_ADDRESS ; // by setting zero, we force a re-deployment
814
+ }
793
815
}
816
+
817
+ const newAddress = await deployContractIfCodeChanged (
818
+ web3 ,
819
+ ForwarderContract ,
820
+ prevAddr ,
821
+ async ( ) => {
822
+ const forwarder = await web3tx ( ForwarderContract . new , `${ ForwarderContract . contractName } .new` ) ( ) ;
823
+ await web3tx (
824
+ forwarder . transferOwnership ,
825
+ "forwarder.transferOwnership"
826
+ ) ( superfluid . address ) ;
827
+
828
+ output += `${ outputKey } =${ forwarder . address } \n` ;
829
+ return forwarder . address ;
830
+ }
831
+ ) ;
832
+
833
+ return newAddress !== ZERO_ADDRESS ? newAddress : prevAddr ;
794
834
}
795
- const prevERC2771ForwarderAddr = await getPrevERC2771ForwarderAddr ( ) ;
796
835
797
- const erc2771ForwarderNewAddress = await deployContractIfCodeChanged (
798
- web3 ,
836
+ const simpleForwarderAddress = await getOrDeployForwarder (
837
+ superfluid ,
838
+ SimpleForwarder ,
839
+ ( ) => superfluid . SIMPLE_FORWARDER ( ) ,
840
+ "SIMPLE_FORWARDER"
841
+ ) ;
842
+
843
+ const erc2771ForwarderAddress = await getOrDeployForwarder (
844
+ superfluid ,
799
845
ERC2771Forwarder ,
800
- prevERC2771ForwarderAddr ,
801
- async ( ) => {
802
- const erc2771Forwarder = await web3tx ( ERC2771Forwarder . new , "ERC2771Forwarder.new" ) ( ) ;
803
- await web3tx (
804
- erc2771Forwarder . transferOwnership ,
805
- "erc2771Forwarder.transferOwnership"
806
- ) ( superfluid . address ) ;
807
- output += `ERC2771_FORWARDER=${ erc2771Forwarder . address } \n` ;
808
- return erc2771Forwarder . address ;
809
- }
846
+ ( ) => superfluid . getERC2771Forwarder ( ) ,
847
+ "ERC2771_FORWARDER"
810
848
) ;
811
- const erc2771ForwarderAddress = erc2771ForwarderNewAddress !== ZERO_ADDRESS
812
- ? erc2771ForwarderNewAddress
813
- : prevERC2771ForwarderAddr ;
814
849
815
850
// get previous callback gas limit, make sure we don't decrease it
816
851
const prevCallbackGasLimit = await superfluid . CALLBACK_GAS_LIMIT ( ) ;
@@ -820,13 +855,6 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
820
855
console . log ( ` !!! CHANGING APP CALLBACK GAS LIMIT FROM ${ prevCallbackGasLimit } to ${ appCallbackGasLimit } !!!` ) ;
821
856
}
822
857
823
- // get prev SimpleForwarder addr (only for replacements for codeChanged check)
824
- let simpleForwarderAddr ;
825
- try {
826
- simpleForwarderAddr = await superfluid . SIMPLE_FORWARDER ( ) ;
827
- } catch ( error ) {
828
- simpleForwarderAddr = ZERO_ADDRESS ;
829
- }
830
858
// deploy new superfluid host logic
831
859
superfluidNewLogicAddress = await deployContractIfCodeChanged (
832
860
web3 ,
@@ -839,13 +867,13 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
839
867
const superfluidLogic = await web3tx (
840
868
SuperfluidLogic . new ,
841
869
"SuperfluidLogic.new"
842
- ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , erc2771ForwarderAddress ) ;
870
+ ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , simpleForwarderAddress , erc2771ForwarderAddress ) ;
843
871
output += `SUPERFLUID_HOST_LOGIC=${ superfluidLogic . address } \n` ;
844
872
return superfluidLogic . address ;
845
873
} ,
846
874
[
847
875
ap ( erc2771ForwarderAddress ) ,
848
- ap ( simpleForwarderAddr ) ,
876
+ ap ( simpleForwarderAddress ) ,
849
877
appCallbackGasLimit . toString ( 16 ) . padStart ( 64 , "0" )
850
878
] ,
851
879
) ;
0 commit comments