UnionBridgeMultiSig is a Solidity contract that uses MultiSigLib to provide membership-based majority voting for managing Union Bridge parameters.
It ensures only authorized members can vote on sensitive bridge operations such as increasing the locking cap or changing transfer permissions.
- MultiSig governance (via MultiSigLib):
- Vote to add/remove members
- Strict majority threshold (
floor(n/2) + 1) - Prevents duplicate votes per proposal
- Blocks removals if result would drop members < 3
- Bridge integration:
- Vote to increase the locking cap
- Vote to set transfer permissions
- Versioning:
- Every membership change increments the multisig version
- Events:
- Emitted for every membership or bridge governance action
Clone your repo and install dependencies:
# install foundry deps
forge install jeremy-then/MultiSigLib
forge install foundry-rs/forge-stdDeploy with an initial set of ≥ 3 unique addresses:
constructor(address[] memory initialMembers)Example (Remix / Anvil):
[
"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
"0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",
"0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db"
]- Vote to add a new member
voteToAddNewMember(address candidate)
- Vote to remove an existing member
voteToRemoveMember(address member)
- Vote to increase the locking cap
voteToIncreaseUnionBridgeLockingCap(uint256 newLockingCap)
- Vote to change transfer permissions
voteToSetUnionBridgeTransferPermissions(bool requestEnabled, bool releaseEnabled)
isMember(address who) → boolgetMembersCount() → uint256getThreshold() → uint256getMultisigVersion() → uint256getNewMemberVotesForThisCandidate(address candidate) → uint256getRemoveMemberVotesForThisMember(address member) → uint256amIAMember() → boolgetLockingCapVotes() → uint256getTransferPermissionsVotes() → uint256
This project includes Foundry tests (test/UnionBridgeMultiSig.t.sol) with a MockBridge injected at the fixed bridge address via vm.etch.
Run tests:
forge test -vvMIT