Skip to content

Conversation

stevieraykatz
Copy link
Contributor

@stevieraykatz stevieraykatz commented Aug 13, 2025

Basenames ecosystem multisig is changing ownership. 6 previous signers are being swapped for 7 new signers.

@cb-heimdall
Copy link
Collaborator

cb-heimdall commented Aug 13, 2025

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 1/2
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 2
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 2
2
1 if commit is unverified 1
Sum 3

Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

@stevieraykatz
Copy link
Contributor Author

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory

  2. Each validations/ folder contains at least one config file:

    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

Not required for this PR.

@base base deleted a comment from github-actions bot Aug 15, 2025
Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

Copy link

❌ Upgrade Structure Validation Failed

The validation check found issues with your upgrade folder structure. Please ensure:

  1. All upgrade folders have a validations/ subdirectory
  2. Each validations/ folder contains at least one config file:
    • base-nested.json (for Coinbase validation)
    • base-sc.json (for Base SC validation)
    • op.json (for OP validation)
  3. All JSON files are valid and follow the correct schema

Please check the CI logs above for specific error details and fix the issues before merging.

📖 See the validation documentation for more details.

To disable the validation check please add a validation.yml file to your upgrade folder with 'disabled': true

require(OWNERS_TO_REMOVE.length > 0);
address prevOwner = SENTINEL_OWNERS;
IGnosisSafe ownerSafe = IGnosisSafe(payable(OWNER_SAFE));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we check for owner changes here or is that pedantic?

require(keccak256(abi.encode(ownerSafe.getOwners())) == keccak256(abi.encode(EXISTING_OWNERS)), "Owner list changed");

require(!ownerSafe.isOwner(OWNERS_TO_ADD[index]), "New owner already owner");
// Prevent duplicates
require(!expectedOwner[OWNERS_TO_ADD[index]], "Duplicate owner detected");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we check for whether the owner is the owner safe itself?

require(OWNERS_TO_ADD[i] != OWNER_SAFE, "Owner cannot be self");

Copy link
Contributor Author

@stevieraykatz stevieraykatz Oct 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a bad idea for next time!

address prevOwner = SENTINEL_OWNERS;
IGnosisSafe ownerSafe = IGnosisSafe(payable(OWNER_SAFE));

for (uint256 i = OWNERS_TO_ADD.length; i > 0; i--) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Curious why we're iterating backwards instead of forwards (i++) like with all the other for loops? Is this just a style thing?

Copy link
Contributor Author

@stevieraykatz stevieraykatz Oct 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because owners are stored in a linked list

Copy link

@ilikesymmetry ilikesymmetry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally there's a lot of boilerplate here that doesn't seem necessary from my naive eyes. Feel like we could make our own separate repo for basenames multisig if we wanted and just optimize for our workflows so each new script diff is minimized to just the new thing we are doing for clarity. Would also let us share the same internals over time and make writing new scripts less risky inherently.

uint256 public immutable THRESHOLD;

constructor() {
OWNER_SAFE = vm.envAddress("OWNER_SAFE");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this need to be env var? Would be easier to verify current owners are trying to remove if we had address in script

}
}

function _buildCalls() internal view override returns (IMulticall3.Call3Value[] memory) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

confused that I'm not seeing this used at all? Same for _postCheck? I'd normally expect the script to be something like:

function run() public {
  _buildCalls();
  _postCheck();
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

look under the hood at the multisig script infra

OWNERS_TO_REMOVE = abi.decode(jsonData.parseRaw(".OwnersToRemove"), (address[]));
}

function setUp() public {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would appreciate some more commenting to make it easier to skim and orient on the intent of each section to make it easier to verify we're doing what we think we want

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For instance, I cannot tell easily why we are doing all these loops vs just simply:

calls = _buildCalls();
execute(calls);
postCheck();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants