Spree::UserMailer.class_eval do
  def signup_confirmation(user)
    @user = user
    mail(:to => user.email, :from => from_address,
         :subject => t(:welcome_to) + Spree::Config[:site_name])
  end

  def confirmation_instructions(user, token)
    @user = user
    @token = token
    subject = t('spree.user_mailer.confirmation_instructions.subject')
    mail(to: user.email,
         from: from_address,
         subject: subject)
  end
end

Spree::UserMailer.class_eval do
  def signup_confirmation(user)
    @user = user
    mail(:to => user.email, :from => from_address,
         :subject => t(:welcome_to) + Spree::Config[:site_name])
  end

  # Overriding `Spree::UserMailer.confirmation_instructions` which is
  # overriding `Devise::Mailer.confirmation_instructions`.
  def confirmation_instructions(user, _opts)
    @user = user
    subject = t('spree.user_mailer.confirmation_instructions.subject')
    mail(to: user.email,
         from: from_address,
         subject: subject)
  end
end

Remove unused variable from mailer
Remove unused variable from mailer

The second variable passed by Devise is actually a hash, not a token.
