@@ -232,6 +232,7 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
232232 "PoolAdminNFT" ,
233233 "PoolMemberNFT" ,
234234 "IAccessControlEnumerable" ,
235+ "SimpleForwarder" ,
235236 "ERC2771Forwarder" ,
236237 ] ;
237238 const mockContracts = [
@@ -270,6 +271,7 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
270271 PoolAdminNFT,
271272 PoolMemberNFT,
272273 IAccessControlEnumerable,
274+ SimpleForwarder,
273275 ERC2771Forwarder,
274276 } = await SuperfluidSDK . loadContracts ( {
275277 ...extractWeb3Options ( options ) ,
@@ -351,6 +353,10 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
351353 `Superfluid.${ protocolReleaseVersion } ` ,
352354 async ( contractAddress ) => ! ( await hasCode ( web3 , contractAddress ) ) ,
353355 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+
354360 const erc2771Forwarder = await web3tx ( ERC2771Forwarder . new , "ERC2771Forwarder.new" ) ( ) ;
355361 console . log ( "ERC2771Forwarder address:" , erc2771Forwarder . address ) ;
356362 output += `ERC2771_FORWARDER=${ erc2771Forwarder . address } \n` ;
@@ -359,15 +365,12 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
359365 const superfluidLogic = await web3tx (
360366 SuperfluidLogic . new ,
361367 "SuperfluidLogic.new"
362- ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , erc2771Forwarder . address ) ;
368+ ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , simpleForwarder . address , erc2771Forwarder . address ) ;
363369 console . log (
364370 `Superfluid new code address ${ superfluidLogic . address } `
365371 ) ;
366372 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+
371374 if ( ! nonUpgradable ) {
372375 const proxy = await web3tx (
373376 UUPSProxy . new ,
@@ -383,10 +386,15 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
383386 superfluidAddress = superfluidLogic . address ;
384387 }
385388 const superfluid = await Superfluid . at ( superfluidAddress ) ;
389+ await web3tx (
390+ simpleForwarder . transferOwnership ,
391+ "simpleForwarder.transferOwnership"
392+ ) ( superfluid . address ) ;
386393 await web3tx (
387394 erc2771Forwarder . transferOwnership ,
388395 "erc2771Forwarder.transferOwnership"
389396 ) ( superfluid . address ) ;
397+
390398 await web3tx (
391399 superfluid . initialize ,
392400 "Superfluid.initialize"
@@ -784,33 +792,60 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
784792 throw new Error ( "Superfluid is not upgradable" ) ;
785793 }
786794
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+ }
793815 }
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 ;
794834 }
795- const prevERC2771ForwarderAddr = await getPrevERC2771ForwarderAddr ( ) ;
796835
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 ,
799845 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"
810848 ) ;
811- const erc2771ForwarderAddress = erc2771ForwarderNewAddress !== ZERO_ADDRESS
812- ? erc2771ForwarderNewAddress
813- : prevERC2771ForwarderAddr ;
814849
815850 // get previous callback gas limit, make sure we don't decrease it
816851 const prevCallbackGasLimit = await superfluid . CALLBACK_GAS_LIMIT ( ) ;
@@ -820,13 +855,6 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
820855 console . log ( ` !!! CHANGING APP CALLBACK GAS LIMIT FROM ${ prevCallbackGasLimit } to ${ appCallbackGasLimit } !!!` ) ;
821856 }
822857
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- }
830858 // deploy new superfluid host logic
831859 superfluidNewLogicAddress = await deployContractIfCodeChanged (
832860 web3 ,
@@ -839,13 +867,13 @@ module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function (
839867 const superfluidLogic = await web3tx (
840868 SuperfluidLogic . new ,
841869 "SuperfluidLogic.new"
842- ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , erc2771ForwarderAddress ) ;
870+ ) ( nonUpgradable , appWhiteListing , appCallbackGasLimit , simpleForwarderAddress , erc2771ForwarderAddress ) ;
843871 output += `SUPERFLUID_HOST_LOGIC=${ superfluidLogic . address } \n` ;
844872 return superfluidLogic . address ;
845873 } ,
846874 [
847875 ap ( erc2771ForwarderAddress ) ,
848- ap ( simpleForwarderAddr ) ,
876+ ap ( simpleForwarderAddress ) ,
849877 appCallbackGasLimit . toString ( 16 ) . padStart ( 64 , "0" )
850878 ] ,
851879 ) ;
0 commit comments