your code don't work i used same one you post

on *:JOIN:#:{
if ($nick == $me) {
%topic $+ chan = $chan(#).topic
}
}

on *:TOPIC:#:{
if ($nick == $me) {
timer 1 3 /set %topic $+ chan $chan(#).topic | halt
}
else { topic # %topic $+ chan }
}

and it gave me this,

MyBotNick changes topic to "4!'!7!'!8!'!9!'!12!'!13!'! what goes around comes around 13!'!12!'!9!'!8!'!7!'!4!"
MeTheOwner changes topic to "welcome to my channel"
MyBotNick changes topic to "chan"

is the "%topic $+ chan" really necessary or you forgot to put the "$" before the "chan" ?