增加芯片升级逻辑

This commit is contained in:
cebgcontract 2022-08-17 11:45:47 +08:00
parent 86e5ec2531
commit defedda2e9
6 changed files with 260 additions and 104 deletions

View File

@ -17,5 +17,7 @@ interface IBEERC1155 is IERC1155 {
uint256[] memory values uint256[] memory values
) external; ) external;
function balanceOf(address account, uint256 id) external view returns (uint256);
function canMint(uint256 id) external view returns (bool); function canMint(uint256 id) external view returns (bool);
} }

View File

@ -8,4 +8,5 @@ import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IBEERC721 is IERC721 { interface IBEERC721 is IERC721 {
function mint(address to, uint256 tokenId) external; function mint(address to, uint256 tokenId) external;
function burn(address owner, uint256 tokenId) external; function burn(address owner, uint256 tokenId) external;
function ownerOf(uint256 tokenId) external view returns (address owner);
} }

View File

@ -0,0 +1,27 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import "../interfaces/IBEERC721.sol";
import "../interfaces/IBEERC1155.sol";
interface IEvolveFactory {
function evolve721NFT(
address to,
uint256[3] calldata tokenIds,
uint256 startTime,
uint256 saltNonce,
bytes calldata signature,
IBEERC721 nft
) external;
function evolveChip(
address to,
uint256[] memory tokenIds,
uint256 startTime,
uint256 saltNonce,
bytes calldata signature
) external;
function useSignature(
bytes calldata signature
) external;
}

View File

@ -17,13 +17,12 @@ contract EvolveFactory is Ownable, TimeChecker, Initializable, HasSignature {
IBEERC721 public hero; IBEERC721 public hero;
IBEERC721 public equip; IBEERC721 public equip;
IBEERC1155 public chip; IBEERC1155 public chip;
uint256 private _duration;
address public executor; address public executor;
event TokenEvolved( event TokenEvolved(
address indexed owner, address indexed owner,
uint256[3] tokenIds uint256[] tokenIds
); );
constructor() constructor()
@ -51,36 +50,32 @@ contract EvolveFactory is Ownable, TimeChecker, Initializable, HasSignature {
uint256 saltNonce, uint256 saltNonce,
bytes calldata signature, bytes calldata signature,
IBEERC721 nft IBEERC721 nft
) internal signatureValid(signature) timeValid(startTime){ ) external signatureValid(signature) timeValid(startTime){
require( require(
tokenIds[0] > 0 && tokenIds[1] > 0, tokenIds[0] > 0 && tokenIds[1] > 0,
"EvolveFactory: equip to evolve and burn can not be 0" "EvolveFactory: token to evolve and burn can not be 0"
); );
require( require(
tokenIds[0] != tokenIds[1], tokenIds[0] != tokenIds[1],
"EvolveFactory: equip to evolve and burn can not be same" "EvolveFactory: token to evolve and burn can not be same"
); );
require( require(
nft.ownerOf(tokenIds[0]) == to, nft.ownerOf(tokenIds[0]) == to && nft.ownerOf(tokenIds[1]) == to,
"EvolveFactory: current address is not owner of this nft now"
);
require(
nft.ownerOf(tokenIds[1]) == to,
"EvolveFactory: current address is not owner of this nft now" "EvolveFactory: current address is not owner of this nft now"
); );
if (tokenIds[2] > 0) { if (tokenIds[2] > 0) {
require( require(
nft.ownerOf(tokenIds[2]) == to, chip.balanceOf(to, tokenIds[2]) > 0,
"EvolveFactory: current address is not owner of this nft now" "EvolveFactory: not enough chip"
); );
} }
uint256[] memory signArray = new uint256[](3); uint256[] memory signArray = new uint256[](3);
for (uint256 i = 0; i < tokenIds.length; ++ i) { for (uint256 i = 0; i < tokenIds.length; ++ i) {
signArray[i] = tokenIds[i]; uint256 _id = tokenIds[i];
signArray[i] = _id;
} }
bytes32 criteriaMessageHash = getMessageHash( bytes32 criteriaMessageHash = getMessageHash(
to, to,
@ -99,11 +94,40 @@ contract EvolveFactory is Ownable, TimeChecker, Initializable, HasSignature {
useSignature(signature); useSignature(signature);
emit TokenEvolved( emit TokenEvolved(
to, to,
tokenIds signArray
); );
} }
function evolveChip(
address to,
uint256[] memory tokenIds,
uint256 startTime,
uint256 saltNonce,
bytes calldata signature
) external signatureValid(signature) timeValid(startTime){
require(to != address(0), "EvolveFacrory: address is zero address");
uint256 len = tokenIds.length;
uint256[] memory amounts = new uint256[](len -1);
uint256[] memory idsForBurn = new uint256[](len - 1);
for (uint256 i = 0; i < len; ++ i) {
require(
chip.balanceOf(to, tokenIds[i]) > 0,
"EvolveFacrory: Chip specified not exists"
);
if (i > 0) {
idsForBurn[i - 1] = tokenIds[i];
amounts[i - 1] = 1;
}
}
bytes32 criteriaMessageHash = getMessageHash(to, startTime, saltNonce, tokenIds);
checkSigner(executor, criteriaMessageHash, signature);
chip.burnBatch(to, idsForBurn, amounts);
useSignature(signature);
emit TokenEvolved(
to,
tokenIds
);
}
function getMessageHash( function getMessageHash(
address _to, address _to,

View File

@ -2,47 +2,138 @@
pragma solidity 0.8.10; pragma solidity 0.8.10;
import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "../interfaces/INFTFactory.sol"; import "../interfaces/IEvolveFactory.sol";
import "../interfaces/IBEERC721.sol"; import "../interfaces/IBEERC721.sol";
import "../interfaces/IBEERC1155.sol"; import "../interfaces/IBEERC1155.sol";
contract UserEvolveFactory is Ownable, Initializable { contract UserEvolveFactory is Ownable, Initializable {
IEvolveFactory factory;
IBEERC721 public hero; IBEERC721 public hero;
IBEERC721 public equip; IBEERC721 public equip;
IBEERC1155 public chip; IBEERC1155 public chip;
IBEERC1155 public shard;
event TokenEvolveFail ( event TokenEvolveFail (
address indexed to, address indexed to,
uint256 mainToken,
bytes signature, bytes signature,
string reason, string reason,
bytes byteReason bytes byteReason
); );
function init() external initializer onlyOwner { function init(address[3] calldata _nfts) external initializer onlyOwner {
hero = IBEERC721(_nfts[0]);
equip = IBEERC721(_nfts[1]);
chip = IBEERC1155(_nfts[2]);
} }
/** /**
* @dev evolve function to Blissful Elites Hero NFT * @dev evolve function Hero NFT
* tokenIds: [hero_to_evolve, hero_for_burn, chip] * tokenIds: [hero_to_evolve, hero_for_burn, chip]
*/ */
function evolveHero( function evolveHero(
uint256[3] calldata tokenIds, uint256[3] calldata tokenIds,
uint256 startTime,
uint256 saltNonce, uint256 saltNonce,
bytes calldata signature bytes calldata signature
) external { ) 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 to Blissful Elites Equip NFT * @dev evolve function for equip NFT
* tokenIds: [equip_to_evolve, equip_for_burn, chip] * tokenIds: [equip_to_evolve, equip_for_burn, chip]
*/ */
function evolveEquip( function evolveEquip(
uint256[3] calldata tokenIds, uint256[3] calldata tokenIds,
uint256 startTime,
uint256 saltNonce, uint256 saltNonce,
bytes calldata signature bytes calldata signature
) external{ ) 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;
}
}
} }

View File

@ -174,7 +174,18 @@ contract UserMinterFactory is Ownable, Initializable {
); );
return false; return false;
} }
}
/**
* @dev mint hero or equip with shard
*/
function shardMixByUser(
uint256[] memory ids,
uint256[] memory amounts,
uint256 startTime,
uint256 saltNonce,
bytes calldata signature
) external returns (bool success) {
return true;
} }
} }