function handleReallocation(
        uint256 campaignId_,
        address userAddress,
        address toToken,
        uint256 toAmount,
        bytes memory data
    ) external payable whenNotPaused {
_transfer(toToken, userAddress, amountReceived);

function _transfer(address token, address to, uint256 amount) internal {
        if (token == NATIVE_TOKEN) {
            (bool sent, ) = to.call{value: amount}("");
            if (!sent) revert NativeTokenTransferFailed();
        } else {
            SafeERC20.safeTransfer(IERC20(token), to, amount);
        }
    }
participations[pID] = Participation({
            status: ParticipationStatus.PARTICIPATING,
            userAddress: userAddress,
            toAmount: amountReceived,
            rewardAmount: userRewards,
            startTimestamp: block.timestamp,
            startBlockNumber: block.number
        });
// Verify that caller is the participation address
            if (participation.userAddress != msg.sender) { 
                revert UnauthorizedCaller(pIDs[i]);
            }
