// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "../interfaces/IEvolveFactory.sol"; import "../interfaces/IBEERC721.sol"; contract UserEvolveFactory is Ownable, Initializable { IEvolveFactory factory; event TokenEvolveFail( address indexed to, uint256 indexed nonce, bytes signature, string reason, bytes byteReason ); function init(address factoryAddress) external initializer onlyOwner { factory = IEvolveFactory(factoryAddress); } /** * @dev evolve function for equip NFT * tokenIds: [nft_to_evolve, nft_for_burn] */ function evolve721NFT( address nftAddress, uint256[2] calldata tokenIds, uint256 startTime, uint256 saltNonce, bytes calldata signature ) external returns (bool success) { address to = _msgSender(); try factory.evolve721NFT(to, nftAddress, tokenIds, startTime, saltNonce, signature) { return true; } catch Error(string memory reason) { bytes memory by; factory.useSignature(signature); emit TokenEvolveFail(to, saltNonce, signature, reason, by); return false; } catch (bytes memory lowLevelData) { factory.useSignature(signature); string memory reason; emit TokenEvolveFail(to, saltNonce, signature, reason, lowLevelData); return false; } } /** * @dev evolve function for chip */ function evolveChip( uint256[] memory ids, uint256 startTime, uint256 saltNonce, bytes calldata signature ) external returns (bool success) { address to = _msgSender(); try factory.evolveChip(to, ids, startTime, saltNonce, signature) { return true; } catch Error(string memory reason) { bytes memory by; factory.useSignature(signature); emit TokenEvolveFail(to, saltNonce, signature, reason, by); return false; } catch (bytes memory lowLevelData) { factory.useSignature(signature); string memory reason; emit TokenEvolveFail(to, saltNonce, signature, reason, lowLevelData); return false; } } }