function attractMeteorites(address userAddress, uint novaCoinCentCost, uint starID) external onlyManager {
    require(astroIndexToOwners[starID] == userAddress);
    uint poolIdx;
    AstroType itemType;
    (poolIdx, itemType) = _extractIndex(idToIndex[starID]);

    require(itemType == AstroType.NormalStar || itemType == AstroType.FamedStar);

    var astroPool = _getAstroPoolByType(itemType);
    Astro storage astro = astroPool[poolIdx];
    require(astro.nextAttractTime <= block.timestamp);

    _attractBalanceCheck(userAddress, novaCoinCentCost);

    var labContract = NovaLabInterface(labAddress);
    uint[] memory newAstroIDs = new uint[](1);
    uint m = labContract.bornMeteorite();
    newAstroIDs[0] = _insertNewAstro(userAddress, AstroType.Meteorite, m, 0, 0);
    
    uint cdIdx = _getCdIdxByCode(astro.code);
    if (cdIdx >= cd.length - 1) {
        astro.nextAttractTime = block.timestamp + cd[cd.length - 1];
    } else {
        astro.code = _updateCdIdxForCode(astro.code, ++cdIdx);
        astro.nextAttractTime = block.timestamp + cd[cdIdx];
    }

    AttractedMeteorites(userAddress, newAstroIDs);
  }