以太猫CryptoKitties源码(七):生成0代猫与促销猫

12、生成0代猫与促销猫

/// 游戏刚开始时,有宣传猫和初代猫两种,宣传猫直接给账号,初代猫放大市场拍卖
contract KittyMinting is KittyAuction {

    // 宣传猫5000只,可以直接发给自己的朋友
    uint256 public constant PROMO_CREATION_LIMIT = 5000;
    // 初代猫45000只
    uint256 public constant GEN0_CREATION_LIMIT = 45000;

    // 初代猫 最初的价格 和 存续期,相当于一个最低价
    uint256 public constant GEN0_STARTING_PRICE = 10 finney;
    uint256 public constant GEN0_AUCTION_DURATION = 1 days;

    // 宣传猫和初代猫的数量
    uint256 public promoCreatedCount;
    uint256 public gen0CreatedCount;

    ///产生宣传猫,只有COO才能调用,可以直接指定基因和拥有者
    /// @param _genes 基因
    /// @param _owner 拥有者
    function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {
        address kittyOwner = _owner;
        if (kittyOwner == address(0)) {
             kittyOwner = cooAddress;
        }
        require(promoCreatedCount < PROMO_CREATION_LIMIT);

        promoCreatedCount++;
        _createKitty(0, 0, 0, _genes, kittyOwner);
    }

    /// 创建初代猫
    ///  直接的放入拍卖所
    function createGen0Auction(uint256 _genes) external onlyCOO {
        require(gen0CreatedCount < GEN0_CREATION_LIMIT);

        uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));
        // 授权给拍卖交易所
        _approve(kittyId, saleAuction);
        // 创建拍卖
        saleAuction.createAuction(
            kittyId,
            _computeNextGen0Price(),
            0,
            GEN0_AUCTION_DURATION,
            address(this)
        );
        // 初代猫数量加1
        gen0CreatedCount++;
    }

    /// 计算拍卖的初始价格
    function _computeNextGen0Price() internal view returns (uint256) {
        // 计算最近五次拍卖的平均价格
        uint256 avePrice = saleAuction.averageGen0SalePrice();

        // 验证
        require(avePrice == uint256(uint128(avePrice)));
        // 价格上涨了50%
        uint256 nextPrice = avePrice + (avePrice / 2);

        // 价格不能低于 初始价格
        if (nextPrice < GEN0_STARTING_PRICE) {
            nextPrice = GEN0_STARTING_PRICE;
        }
        // 返回最新的价格
        return nextPrice;
    }
}

KittyCore.sol

/// 
contract KittyCore is KittyMinting {

    // 设置新的合约地址,这是在游戏项目出现巨大的问题时,我们可以设置新的合约来升级
    address public newContractAddress;

    /// 构造函数
    function KittyCore() public {
        // 暂停
        paused = true;

        // 合约的部署地址就是CEO
        ceoAddress = msg.sender;

        // 合约的部署地址也是CEO
        cooAddress = msg.sender;

        // 创建了一只猫
        _createKitty(0, 0, 0, uint256(-1), address(0));
    }

    /// 设置新的合约地址
    function setNewAddress(address _v2Address) external onlyCEO whenPaused {
       
        newContractAddress = _v2Address;
        // 触发合约变更事件
        ContractUpgrade(_v2Address);
    }

    /// 转账,必须是拍卖所的合约
    // 匿名函数,用户直接给合约地址转账时,报错,这是为了防止误操作,只有交易所才能给合约转账
    function() external payable {
        // 
        require(
            msg.sender == address(saleAuction) ||
            msg.sender == address(siringAuction)
        );
    }

    /// 获取代币(猫)的信息
    /// @param _id 猫的id 
    function getKitty(uint256 _id)
        external
        view
        returns (
        bool isGestating,
        bool isReady,
        uint256 cooldownIndex,
        uint256 nextActionAt,
        uint256 siringWithId,
        uint256 birthTime,
        uint256 matronId,
        uint256 sireId,
        uint256 generation,
        uint256 genes
    ) {
        Kitty storage kit = kitties[_id];

        // if this variable is 0 then it's not gestating
        isGestating = (kit.siringWithId != 0);
        isReady = (kit.cooldownEndBlock <= block.number);
        cooldownIndex = uint256(kit.cooldownIndex);
        nextActionAt = uint256(kit.cooldownEndBlock);
        siringWithId = uint256(kit.siringWithId);
        birthTime = uint256(kit.birthTime);
        matronId = uint256(kit.matronId);
        sireId = uint256(kit.sireId);
        generation = uint256(kit.generation);
        genes = kit.genes;
    }

    /// 解锁暂停,只有ceo才能调用
    function unpause() public onlyCEO whenPaused {
        // 要求交易所地址不能为 0 
        require(saleAuction != address(0));
        require(siringAuction != address(0));
        // 要求基因组成地址不能为 0 
        require(geneScience != address(0));
         // 要求新的合约地址不能为 0 
        require(newContractAddress == address(0));

        // 解除暂停
        super.unpause();
    }

    // 转账到CFO address
    function withdrawBalance() external onlyCFO {
        // 本合约地址的金额
        uint256 balance = this.balance;
        // 计算怀孕猫的总的保证金
        uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;

        if (balance > subtractFees) {
            // 总的金额减去 怀孕猫的保证金,这个是要返还的
            cfoAddress.send(balance - subtractFees);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【注】本文较长,基本上集合了所有症状,建议转电脑上,利用Ctrl+F查看 猫杯状病毒病 猫杯状病毒(FelineC...
    妞妞的铲屎官阅读 47,908评论 5 43
  • 一、合约开发流程 语言:使用 node.js 开发该项目大概流程: 合约代码编写(Solidity)-> 合约编译...
    wustmz阅读 3,831评论 0 1
  • 早晨钻在被窝里就听见校园里有人在扫雪,隐约听见:好几年都没遇见这么大的雪了。我仰起头看看窗户,外面亮亮的,平常7点...
    田春天阅读 1,774评论 0 0
  • 关掉电脑,收起手机,离开高楼林立的都市,远行至戈壁,对国内大部分企业家来讲,都是鲜有的经历,对精彩旅图董事长张江霖...
    漫游家阅读 170,279评论 1 0
  • 这里挺落后的,很吵,虽说是农村却没有农村的韵味,更加没有一丝城乡的味道。可是这里是我喜欢的。这里没有图书馆,...
    CHENYLING阅读 1,566评论 0 0