function hatchEgg() isActive requireDataContract requireTransformDataContract external {
        
        lastHatchingAddress = msg.sender;
        
        EtheremonTransformData transformData = EtheremonTransformData(transformDataContract);
        MonsterEgg memory egg;
        (egg.eggId, egg.objId, egg.classId, egg.trainer, egg.hatchTime, egg.newObjId) = transformData.getHatchingEggData(msg.sender);
        
        if (egg.eggId == 0 || egg.trainer != msg.sender)
            revert();
        
        if (egg.newObjId > 0 || egg.hatchTime > block.timestamp) {
            revert();
        }
        
        uint64 objId = addNewObj(msg.sender, egg.classId);
        transformData.setHatchedEgg(egg.eggId, objId);
        EventHatchEgg(msg.sender, egg.eggId, objId);
    }