becrypto/contracts/logic/UserEvolveFactory.sol
2022-08-17 11:45:47 +08:00

140 lines
3.3 KiB
Solidity

// 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";
import "../interfaces/IBEERC1155.sol";
contract UserEvolveFactory is Ownable, Initializable {
IEvolveFactory factory;
IBEERC721 public hero;
IBEERC721 public equip;
IBEERC1155 public chip;
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]);
chip = IBEERC1155(_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;
}
}
}