The GiveEgg routine in Crystal (haven't checked Gold/Silver) has two bugs. First, it writes the egg into the party (and thus, munges Pokédex flags) according to the minimal[1] evolution of the Pokémon intended to be in the egg, but then rewrites the egg to be the intended Pokémon. This discrepancy presumably escaped notice because eggs are always already converted to their minimal evolution before this code runs (in such places as the daycare code). This leads to the second bug, which is in the Pokédex flag munging. The code stores whether the seen and caught flags were set before writing the egg into the party (which is done in a way that sets the seen and caught flags for whatever is being written into the party) so it can restore them so that merely receiving the egg doesn't give Pokédex flags yet. But it gets them the wrong way around during the restoration. The result is that if you receive an egg of a Pokémon that is not minimally-evolved, you get the seen and caught flags for it immediately without having to wait for it to hatch, and receiving any egg will switch the values of the seen and caught flags with each other for its minimal evolution. (The only practical consequence is that if you have seen but not caught it, you will then have caught but not seen it. It will count in the total shown in the Pokédex, on the save screen, and in similar places, but its entry will not be available in the Pokédex.) This presumably went unnoticed because in vanilla this can only happen for already minimally-evolved Pokémon, and hatching the egg will give you the seen flag again. So if you've already seen but not caught the hatchling, it starts to count toward your caught total immediately upon receiving the egg but becomes invisible in your Pokédex until it hatches - a short window to spot a subtle discrepancy. Have fun. But watch out for this in Crystal rando catch-'em-alls. ~stump (twitch.tv/stump230, twitter.com/stump230) [1]: Really, only up to two stages back.