canvas-website/contracts/WebCryptoProxyFactory.sol

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];
}
}