Description
The LikeRegistry contract creates MultiSig wallets for matched users but fails to track or record these wallet addresses. This leads to potential loss of access to funds, difficulty in contract management, and inability to use the wallet.
In the matchRewards
function, MultiSig wallets are created but not tracked:
function matchRewards(address from, address to) internal {
MultiSigWallet multiSigWallet = new MultiSigWallet(from, to);
(bool success,) = payable(address(multiSigWallet)).call{value: rewards}("");
require(success, "Transfer failed");
}
Impact:
Lost access to MultiSig wallets and funds
No way to verify correct wallet for match
No audit trail of deployments (no event emitted)
No way to lookup MultiSig wallet for a match
Lost access if frontend doesn't capture deployment
Proof of Concept:
function testUntrackedWallet() public {
vm.deal(user, 2 ether);
vm.deal(user2, 2 ether);
vm.startPrank(user2);
soulboundNFT.mintProfile("Bob", 28, "ipfs://bob");
vm.stopPrank();
vm.startPrank(user);
soulboundNFT.mintProfile("Alice", 25, "ipfs://alice");
likeRegistry.likeUser{value: 1 ether}(user2);
vm.stopPrank();
vm.startPrank(user2);
likeRegistry.likeUser{value: 1 ether}(user);
vm.stopPrank();
}
Recommended Mitigation Steps
struct MatchWallet {
address multiSigAddress;
uint256 createdAt;
uint256 fundingAmount;
bool isActive;
}
mapping(address => mapping(address => MatchWallet)) public matchWallets;
function matchRewards(address from, address to) internal {
MultiSigWallet multiSigWallet = new MultiSigWallet(from, to);
matchWallets[from][to] = MatchWallet({
multiSigAddress: address(multiSigWallet),
createdAt: block.timestamp,
fundingAmount: rewards,
isActive: true
});
matchWallets[to][from] = matchWallets[from][to];
emit MultiSigCreated(from, to, address(multiSigWallet), rewards);
(bool success,) = payable(address(multiSigWallet)).call{value: rewards}("");
require(success, "Transfer failed");
}
function getMatchMultiSig(address user1, address user2)
external
view
returns (
address multiSigAddress,
uint256 createdAt,
uint256 fundingAmount,
bool isActive
)
{
MatchWallet memory wallet = matchWallets[user1][user2];
require(wallet.multiSigAddress != address(0), "No MultiSig found");
return (
wallet.multiSigAddress,
wallet.createdAt,
wallet.fundingAmount,
wallet.isActive
);
}
Tools Used