code: def propagate(id, _)
        start = Time.now
        modified = []
        total = 0
        network = @wallets.acq(id, &:network)
        @wallets.acq(id, &:txns).select { |t| t.amount.negative? }.each do |t|
          total += 1
          if t.bnf == id
            @log.error("Paying itself in #{id}? #{t}")
            next
          end
          @wallets.acq(t.bnf, exclusive: true) do |target|
            unless target.exists?
              @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wallet is absent")
              next
            end
            unless target.network == network
              @log.debug("#{t.amount * -1} to #{t.bnf}: network mismatch, '#{target.network}'!='#{network}'")
              next
            end
            next if target.includes_positive?(t.id, id)
            unless target.prefix?(t.prefix)
              @log.debug("#{t.amount * -1} from #{id} to #{t.bnf}: wrong prefix \"#{t.prefix}\" in \"#{t}\"")
              next
            end
            target.add(t.inverse(id))
            @log.info("#{t.amount * -1} arrived to #{t.bnf}: #{t.details}")
            modified << t.bnf
          end
        end
        modified.uniq!
        @log.debug("Wallet #{id} propagated successfully, #{total} txns \
  in #{Age.new(start, limit: 20 + total * 0.005)}, #{modified.count} wallets affected")
        modified.each do |w|
          @wallets.acq(w, &:refurbish)
        end
        modified
      end
docs: Returns list of Wallet IDs which were affected