Cannot Upgrade UUPS Contract whose ownership belong to GNOSIS Safe as proposal link gives error

I get this error when i try to open a proposal for upgrading a UUPS Proxy Contract that belongs to a Gnosis Safe.
"Something went wrong when trying to load this proposal (Cannot determine upgrades owner)
My flow is like this. I create a contract using hardhat, transfer its ownership to a gnosis safe created on the defender dashboard using transferOwnership function of the contract. After that following the tutorial below i create a proposal to the contract address to upgrade contract to V2. The proposal is created. But when i click the proposal I get the above error. The contract is ownable & i can clearly see gnosis safe as the owner in defender dashboard. But i cannot upgrade as the proposal won't open.



Capture3

:1234: Code to reproduce
deploy.js

async function main() {

  const ThorCar = await ethers.getContractFactory("Thor");

  const thorCar = await upgrades.deployProxy(ThorCar, ["http://rh.hashmakersol.com/Metadata/"], { kind: 'uups' });

  console.log("Thor deployed to:", thorCar.address);

}

// We recommend this pattern to be able to use async/await everywhere

// and properly handle errors.

main()

  .then(() => process.exit(0))

  .catch((error) => {

    console.error(error);

    process.exit(1);

  });

transferOwnership.js

const { upgrades, ethers } = require("hardhat");

// scripts/transfer-ownership.js

async function main() {

    const contractAddress = "0x5D3FA142814d0643E68C0BF81C5005E8B2626380";

   

    const newOwner = "0xF05D4091876cbBB5E18662E30D00F595e6d92660";//gnosis safe

    const TC = await ethers.getContractFactory("Thor");

    const tc = await TC.attach(contractAddress);

    const tx= await tc.transferOwnership(newOwner);

  console.log('Transferring ownership ...');

    await tx.wait();

   

  console.log('Transferred ownership ', newOwner);

}

main()

  .then(() => process.exit(0))

  .catch(error => {

    console.error(error);

    process.exit(1);

  });

proposeUpgrade.js

async function main() {

  const proxyAddress = '0x5D3FA142814d0643E68C0BF81C5005E8B2626380';

  const ThorV2 = await ethers.getContractFactory("ThorV2");

  console.log("Preparing proposal...");

  const proposal = await defender.proposeUpgrade(proxyAddress, ThorV2);

  console.log("Upgrade proposal created at:", proposal.url);

}

main()

  .then(() => process.exit(0))

  .catch(error => {

    console.error(error);

    process.exit(1);

  })

If you're using a Gnosis Safe to process the upgrade, you'll need to create your proposal differently:

  const proposal = await defender.proposeUpgrade(deployedContractAddress, contractFactory, {
    description: "Optional description here",
    multisig: '0xabcdef', // Your Gnosis Safe address here
    multisigType: 'Gnosis Safe',
    title: "Optional title here",
  });
1 Like