// 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; IBEERC721 public hero; IBEERC721 public equip; event TokenEvolveFail( address indexed to, bytes signature, string reason, bytes byteReason ); function init(address[3] calldata _nfts) external initializer onlyOwner { hero = IBEERC721(_nfts[0]); equip = IBEERC721(_nfts[1]); factory = IEvolveFactory(_nfts[2]); } /** * @dev evolve function Hero NFT * tokenIds: [hero_to_evolve, hero_for_burn, chip] */ function evolveHero( uint256[3] calldata tokenIds, uint256 startTime, uint256 saltNonce, bytes calldata signature ) external returns (bool success) { address to = _msgSender(); try factory.evolve721NFT(to, tokenIds, startTime, saltNonce, signature, hero) { return true; } catch Error(string memory reason) { bytes memory by; factory.useSignature(signature); emit TokenEvolveFail(to, signature, reason, by); return false; } catch (bytes memory lowLevelData) { factory.useSignature(signature); string memory reason; emit TokenEvolveFail(to, signature, reason, lowLevelData); return false; } } /** * @dev evolve function for equip NFT * tokenIds: [equip_to_evolve, equip_for_burn, chip] */ function evolveEquip( uint256[3] calldata tokenIds, uint256 startTime, uint256 saltNonce, bytes calldata signature ) external returns (bool success) { address to = _msgSender(); try factory.evolve721NFT(to, tokenIds, startTime, saltNonce, signature, equip) { return true; } catch Error(string memory reason) { bytes memory by; factory.useSignature(signature); emit TokenEvolveFail(to, signature, reason, by); return false; } catch (bytes memory lowLevelData) { factory.useSignature(signature); string memory reason; emit TokenEvolveFail(to, 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, signature, reason, by); return false; } catch (bytes memory lowLevelData) { factory.useSignature(signature); string memory reason; emit TokenEvolveFail(to, signature, reason, lowLevelData); return false; } } }