how can i deploy the contracts below as Transparent upgradable proxies using hardhat and javaScript, note that the argument initialValues is required in order to call to initialize all contracts
//SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract Messenger {
uint256 i;
struct Message {
address sender;
address reciever;
string notes;
}
address senderAddress;
mapping(uint256 => Messenger) public IdTochat;
function initialize(address _config) external {
senderAddress = config.getUserProfileAddress();
}
function sendMessage(string memory _message) public {
require(senderAddress == _msgSender());
IdTochat[i] = Message(senderAddress, receieverAddress, _message);
i++;
}
function getNumberOfMessages()external view returns(uint256){
return i;
}
}
//SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract Base {
address private messengerContractAddress;
enter code here
function initialize(bytes calldata initialValue) external {
// Decode the address from the initialization data
messengerContractAddress = abi.decode(
initialValue,
(messengerContractAddress)
);
}
function getMessengerContractAddress() public view returns
(address) {
return messengerContractAddress;
}
}
pragma solidity 0.8.19;
contract Config {
struct ConfigData {
address messenger;
address user;
}
uint256 public constant ADDRESS_MESSENGER =
uint256(keccak256("ADDRESS_MESSENGER"));
uint256 public constant ADDRESS_USER = uint256(keccak256("ADDRESS_USER"));
mapping(uint256 => uint256) public configMap;
function initialize(bytes calldata initialValue) external {
ConfigData memory configData = abi.decode(initialValues, (ConfigData));
configMap[ADDRESS_MESSENGER] = uint256(uint160(configData.messenger));
configMap[ADDRESS_MESSENGER] = uint256(uint160(configData.user));
}
function geMessengerAddress() public view returns (address) {
return address(uint160(configData.messenger));
}
function getUserProfileAddress() public view returns (address) {
return address(uint160(configData.user));
}
}
