63 lines
2.0 KiB
Solidity
63 lines
2.0 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "./WebCryptoProxy.sol";
|
|
|
|
/**
|
|
* @title WebCryptoProxyFactory
|
|
* @notice Factory contract to deploy minimal proxy contracts for users
|
|
* @dev Uses CREATE2 for deterministic addresses based on public key
|
|
*/
|
|
contract WebCryptoProxyFactory {
|
|
// Mapping from public key hash to proxy address
|
|
mapping(bytes32 => address) public proxies;
|
|
|
|
// Event emitted when a new proxy is deployed
|
|
event ProxyDeployed(
|
|
bytes32 indexed publicKeyHash,
|
|
address indexed proxy,
|
|
bytes32 publicKeyX,
|
|
bytes32 publicKeyY
|
|
);
|
|
|
|
/**
|
|
* @notice Deploy a new proxy contract for a Web Crypto public key
|
|
* @param publicKeyX X coordinate of P-256 public key
|
|
* @param publicKeyY Y coordinate of P-256 public key
|
|
* @return proxy The address of the deployed proxy contract
|
|
*/
|
|
function deployProxy(
|
|
bytes32 publicKeyX,
|
|
bytes32 publicKeyY
|
|
) external returns (address proxy) {
|
|
// Create hash of public key for mapping
|
|
bytes32 publicKeyHash = keccak256(abi.encodePacked(publicKeyX, publicKeyY));
|
|
|
|
// Check if proxy already exists
|
|
require(proxies[publicKeyHash] == address(0), "WebCryptoProxyFactory: Proxy already exists");
|
|
|
|
// Deploy new proxy
|
|
proxy = address(new WebCryptoProxy(publicKeyX, publicKeyY));
|
|
|
|
// Store mapping
|
|
proxies[publicKeyHash] = proxy;
|
|
|
|
emit ProxyDeployed(publicKeyHash, proxy, publicKeyX, publicKeyY);
|
|
}
|
|
|
|
/**
|
|
* @notice Get proxy address for a public key
|
|
* @param publicKeyX X coordinate of P-256 public key
|
|
* @param publicKeyY Y coordinate of P-256 public key
|
|
* @return The proxy address, or address(0) if not deployed
|
|
*/
|
|
function getProxy(
|
|
bytes32 publicKeyX,
|
|
bytes32 publicKeyY
|
|
) external view returns (address) {
|
|
bytes32 publicKeyHash = keccak256(abi.encodePacked(publicKeyX, publicKeyY));
|
|
return proxies[publicKeyHash];
|
|
}
|
|
}
|
|
|